2015-10-13 4 views
0

Я использую OWIN Oauth в своем приложении ASP.NET MVC для предоставления токена доступа для мобильных приложений. Вот установка OAuth:OWIN Oauth differentiate expired и invalid token

 app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions 
     { 
      TokenEndpointPath = new PathString("/api/authenticate/login"), 
      Provider = dependencyContainer.GetService<IOAuthAuthorizationServerProvider>(), 
      RefreshTokenProvider = dependencyContainer.GetService<IAuthenticationTokenProvider>(), 
      AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(applicationSettings.AccessTokenLifeTimeInMinutes), 
      AllowInsecureHttp = true 
     }); 

     app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()); 

У меня также есть пользовательский поставщик и пользовательские обновления маркера поставщика, как вы можете видеть выше. Все работает отлично, когда запрос с мобильного телефона истек или недействительным, я использую пользовательский AuthorizeAttribute вернуть JSON с сообщением «несанкционированным»

public class ApiAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     filterContext.Result = new JsonResult 
     { 
      Data = new 
      { 
       success = false, 
       error = "Unauthorized" 
      }, 
      JsonRequestBehavior = JsonRequestBehavior.AllowGet 
     }; 
    } 
} 

Однако в одном сценарии, мобильные приложения должны дифференцировать ответ от сервера на 2 случая: токен доступа истек, или токен доступа недействителен (.eg изменен в середине). Я не уверен, как я могу реализовать это требование. Я попытался создать маркер пользовательского поставщика доступа, унаследовав от AuthenticationTokenProvider, зарегистрировать его в UseOAuthAuthorizationServer() выше, но и Receive() и ReceiveAsync() не вызывается, когда сервер получает маркер доступа от мобильного

ответ

3

решенный проблема. Мой подход к созданию поставщика токенов доступа работает. Сначала я зарегистрировал его с UseOAuthAuthorizationServer(), но он должен быть зарегистрирован с помощью UseOAuthBearerAuthentication() вместо

Вот мой собственный класс, в случае, если кому-то нужен:

public class CustomAccessTokenProvider : AuthenticationTokenProvider 
{ 
    public override void Receive(AuthenticationTokenReceiveContext context) 
    { 
     context.DeserializeTicket(context.Token); 
     var expired = context.Ticket.Properties.ExpiresUtc < DateTime.UtcNow; 
     if (expired) 
     { 
      //If current token is expired, set a custom response header 
      context.Response.Headers.Add("X-AccessTokenExpired", new string[] { "1" }); 
     } 

     base.Receive(context); 
    } 
} 

Зарегистрируйте при настройке Owin OAuth:

app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions 
      { 
       AccessTokenProvider = new CustomAccessTokenProvider() 
      }); 
+0

Можем ли мы вернуть сообщение об ошибке в теле ответа, человек? –

+0

@BuiQuangHuy да, в CustomAccessTokenProvider у вас есть доступ к context.Response, чтобы вы могли делать все, что хотите, с помощью потока ответов –