2015-10-13 27 views
0

我在ASP.NET MVC应用程序中使用OWIN Oauth为移动应用程序提供访问令牌。以下是OAuth的设置:OWIN Oauth区分过期和无效令牌

 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与消息中的一个场景“未经授权”

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

但是返回一个JSON,移动应用程序需要区分服务器对2种情况的响应:访问令牌已过期,或者访问令牌无效(在中间修改.eg)。我不确定我如何实现这一要求。我试图创建一个自定义的访问令牌供应商,从AuthenticationTokenProvider继承,在UseOAuthAuthorizationServer注册它()以上,但两者接收()和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,因此您可以对响应流进行任何操作 –