Asp.net
如何使用 JwtSecurityTokenHandler 和 JWKS 端點驗證 JWT?
我正在設計使用 IdentityServer4 來保護多個服務的原型,但需要注意的是,這些服務可能不會被遷移(在可預見的將來)以使用 ASP.NET Core 的 OWIN 中間件習語。因此,我無法通過簡單地提供 IdentityServer 的著名 JWKS 端點等方式來利用許多中間件助手來自動驗證 JWT。
如果我能重建這種行為,那就太好了,如果可能的話,我想利用微軟的
JwtSecurityTokenHandler實現。但是,我不知道如何利用 IdentityServer 的發現端點提供的JsonWebKeySet和JsonWebKey類型來提取密鑰並執行驗證。
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不是最新的。)
檢查此範例:
它從 JWK 手動檢索密鑰並填充驗證參數。
var jwks = "{ keys: [..." // your jwks json string var signingKeys = new JsonWebKeySet(jwks).GetSigningKeys();然後只需將其分配給
IssuerSigningKeys您的TokenValidationParameters.如果您正在從 Web 服務讀取 jwks,那麼您將需要一個 http 客戶端來首先讀取它。