2015-08-24 4 views
4

В настоящее время разрабатывается сервер авторизации с использованием Owin, Oauth, Claims.Web API OAUTH - различать, если Идентифицировать токен истек или неавторизован

Ниже мой OAuth конфигурации и у меня есть 2 вопроса

OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions() 
    { 

    AllowInsecureHttp = true, 
    TokenEndpointPath = new PathString("/token"), 
    AccessTokenExpireTimeSpan = TimeSpan.FromSeconds(1000), 
    Provider = new AuthorizationServerProvider() 
    //RefreshTokenProvider = new SimpleRefreshTokenProvider() 
    }; 
    app.UseOAuthAuthorizationServer(OAuthServerOptions); 
    app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()); 

Если маркер истек, и пользователь доступа с помощью маркера с истекшим сроком действия пользователя получает 401 (Несанкционированное) .Checking с помощью Fiddler.

Как я могу отправить настроенное сообщение пользователю, указав ваш токен как истек. Какую функцию или модуль мне нужно переопределить.

и еще один вопрос - что такое нижняя строка?

app.UseOAuthBearerAuthentication (новый OAuthBearerAuthenticationOptions()); Мне действительно нужно это реализовать, потому что, когда я проверил его, он работает без указанной выше строки. Любое нарушение безопасности?

ответ

4

Вы не можете напрямую настроить поведение для истекших токенов, но вы можете сделать это с помощью специального промежуточного программного обеспечения.

Сначала переопределите AuthenticationTokenProvider, чтобы вы могли перехватить билет аутентификации до того, как он будет отброшен по мере истечения срока действия.

public class CustomAuthenticationTokenProvider : AuthenticationTokenProvider 
{ 
    public override void Receive(AuthenticationTokenReceiveContext context) 
    { 
     context.DeserializeTicket(context.Token); 

     if (context.Ticket != null && 
      context.Ticket.Properties.ExpiresUtc.HasValue && 
      context.Ticket.Properties.ExpiresUtc.Value.LocalDateTime < DateTime.Now) 
     { 
      //store the expiration in the owin context so that we can read it later a middleware 
      context.OwinContext.Set("custom.ExpriredToken", true); 
     } 
    } 
} 

и настроить его в автозагрузке вместе с небольшим пользовательским промежуточным

using AppFunc = System.Func<System.Collections.Generic.IDictionary<string, object>, System.Threading.Tasks.Task>; 

app.UseOAuthAuthorizationServer(OAuthServerOptions); 
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions() 
{ 
    AccessTokenProvider = new CustomAuthenticationTokenProvider() 
}); 

//after the request has been authenticated or not 
//check for our custom env setting and act accordingly 
app.Use(new Func<AppFunc, AppFunc>(next => (env) => 
{ 
    var ctx = new OwinContext(env); 
    if (ctx.Get<bool>("custom.ExpriredToken")) 
    { 
     //do wathever you want with the response 
     ctx.Response.StatusCode = 401; 
     ctx.Response.ReasonPhrase = "Token exprired"; 

     //terminate the request with this middleware 
     return Task.FromResult(0); 
    } 
    else 
    { 
     //proceed with the rest of the middleware pipeline 
     return next(env); 
    } 
})); 

Если вы заметили, я разместил на заказ промежуточного программного обеспечения после вызова UseOAuthBearerAuthentication и это важно и стебли из ответьте на свой второй вопрос.

OAuthBearerAuthenticationMidlleware несет ответственность за аутентификацию, но не за авторизацию. Таким образом, он просто считывает токен и заполняет информацию, чтобы к нему можно было получить доступ с помощью IAuthenticationManager позже в конвейере.

Так что да, с или без него, все ваши запросы выдаются как 401 (несанкционированные), даже те, у которых есть действующие токены.

+0

Идеальное решение, сэкономьте много времени! –

Смежные вопросы