2015-12-09 64 views
1

我正在使用Visual Studio 2015 Enterprise Update 1和ASP.NET vNext rc1-update1發佈並使用描述爲here的JWT令牌。使用AspNet.Security.OpenIdConnect.Server(ASP.NET vNext)進行自定義生命週期驗證

在我們的實現中,我們想要控制令牌生存期驗證。

我們嘗試了幾種方法,所有這些方法都有不良副作用。例如,在一個嘗試,我們接手TokenValidationParameters.TokenValidationParameters.LifetimeValidator事件在配置方法:

app.UseJwtBearerAuthentication 
(
    options => 
    { 
     options.TokenValidationParameters = new TokenValidationParameters() 
     { 
      LifetimeValidator = (DateTime? notBefore, DateTime? expires, SecurityToken securityToken, TokenValidationParameters validationParameters) => 
      { 
       // Pretend to do custom validation 
       return false; 
      } 
     }; 
    } 
); 

這事件引起驗證失敗,因爲我們想,但客戶端,而我們會收到一個500錯誤喜歡返回一個400系列錯誤和一個小負載。

在我們試圖TokenValidationParameters.Events的各種實現方式,比如在ValidatedToken事件檢測要求,但發現我們無法阻止中間件援引拋出異常的控制器動作較短,讓我們回到500的另一種嘗試錯誤問題。

所以我的問題是:

  • 什麼就是什麼接管壽命驗證與OIDC的最佳實踐?

  • 我們是否可以強制OIDC不要在像「nbf」這樣的標記中包含某些生命期聲明,因爲我們不需要它們呢?

回答

1

編輯:此錯誤在ASP.NET Core RC2中修復。此答案中描述的解決方法不再需要。


這是一個known bug。遺憾的是,the workaround you could use in beta8不再起作用in RC1

您唯一的選擇是編寫捕獲異常的中間件,以防止服務器返回500響應。當然,這很醜陋,可能會隱藏重要的例外情況,但這是RC1唯一可用的解決方法。

下面是一個例子(確保JWT承載中間件之前進行註冊):

app.Use(next => async context => { 
    try { 
     await next(context); 
    } 

    catch { 
     // If the headers have already been sent, you can't replace the status code. 
     // In this case, throw an exception to close the connection. 
     if (context.Response.HasStarted) { 
      throw; 
     } 

     context.Response.StatusCode = 401; 
    } 
}); 
+0

謝謝,@Pinpoint。您是否也可以告訴我,我們是否可以控制OIDC生成的令牌中包含哪些生存期聲明?例如,我們可以刪除「iat」,「nbf」等? – 42vogons

+0

您無法直接訪問這些非用戶聲明,但有更好的方法來控制OIDC服務器發佈的令牌的生命週期:最簡單的方法是通過選項(通過更新「AccessTokenLifetime」/「IdentityTokenLifetime」 /'RefreshTokenLifetime')。另一個是通過'SerializeAccessToken'事件,您可以在其中更新與身份驗證票證關聯的'IssuedUtc' /'ExpiresUtc'屬性(通過'context.AuthenticationTicket.Properties')。 – Pinpoint

+0

對於閱讀這些評論的其他人,我們發現在上面的示例代碼中捕獲SecurityTokenInvalidLifetimeException完全符合我們的需求。 – 42vogons