Asp.net

如何使用 JwtSecurityTokenHandler 和 JWKS 端點驗證 JWT?

  • October 9, 2020

我正在設計使用 IdentityServer4 來保護多個服務的原型,但需要注意的是,這些服務可能不會被遷移(在可預見的將來)以使用 ASP.NET Core 的 OWIN 中間件習語。因此,我無法通過簡單地提供 IdentityServer 的著名 JWKS 端點等方式來利用許多中間件助手來自動驗證 JWT。

如果我能重建這種行為,那就太好了,如果可能的話,我想利用微軟的JwtSecurityTokenHandler實現。但是,我不知道如何利用 IdentityServer 的發現端點提供的JsonWebKeySetJsonWebKey類型來提取密鑰並執行驗證。

JwtSecurityTokenHandler用於TokenValidationParameters驗證 JWT,並且這些參數需要一個或多個SecurityKey對象的實例來執行驗證。

ClaimsPrincipal ValidateJwt(string token, IdentityModel.Client.DiscoveryResponse discovery)
{
   JwtSecurityToken jwt = new JwtSecurityToken(token);

   TokenValidationParameters validationParameters = new TokenValidationParameters
   {
       ValidateAudience = true,
       ValidateIssuer = true,
       RequireSignedTokens = true,
       ValidIssuer = "expected-issuer",
       ValidAudience = "expected-audience",
       IssuerSigningKeys = discovery.KeySet.Keys /* not quite */
   };

   JwtSecurityTokenHandler handler = new JwtSecurityTokenHandler();
   SecurityToken validatedToken;
   return handler.ValidateToken(jwt, validationParameters, out validatedToken);
}

如何執行必要的從JsonWebKeySetto轉換以IEnumerable<SecurityKey>進行驗證?是否有另一種方法(除了 OWIN 中間件)也可以使用上述DiscoveryResponse數據?

(遺憾的是,文件System.IdentityModel.Tokens.Jwt不是最新的。)

檢查此範例:

https://github.com/IdentityServer/IdentityServer4/blob/master/samples/Clients/old/MvcManual/Controllers/HomeController.cs#L148

它從 JWK 手動檢索密鑰並填充驗證參數。

var jwks = "{ keys: [..." // your jwks json string
var signingKeys = new JsonWebKeySet(jwks).GetSigningKeys();

然後只需將其分配給IssuerSigningKeys您的TokenValidationParameters.

如果您正在從 Web 服務讀取 jwks,那麼您將需要一個 http 客戶端來首先讀取它。

引用自:https://stackoverflow.com/questions/40623346