2015-10-13 81 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,因此您可以對響應流進行任何操作 –