如何使用 JwtSecurityTokenHandler 和 JWKS 端点验证 JWT?

Posted

技术标签:

【中文标题】如何使用 JwtSecurityTokenHandler 和 JWKS 端点验证 JWT?【英文标题】:How do I validate a JWT using JwtSecurityTokenHandler and a JWKS endpoint? 【发布时间】:2017-03-30 03:11:12 【问题描述】:

我正在设计使用 IdentityServer4 来保护多个服务的原型,但需要注意的是,这些服务可能不会被迁移(在可预见的将来)以使用 ASP.NET Core 的 OWIN 中间件惯用语。因此,我无法通过简单地提供 IdentityServer 的众所周知的 JWKS 端点来利用许多中间件助手来自动验证 JWT。

如果我能重建这种行为,那就太好了,如果可能的话,我想利用 Microsoft 的 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);

如何执行从JsonWebKeySetIEnumerable<SecurityKey> 的必要转换,以便进行验证?是否有另一种方法(除了 OWIN 中间件)也可以使用上面的 DiscoveryResponse 数据?

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

【问题讨论】:

【参考方案1】:

检查此示例:

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

它从 JWK 手动检索密钥并填充验证参数。

【讨论】:

这太棒了——谢谢!我忽略了示例,在浏览中间件实现的源代码时迷失了方向:) 任何没有身份服务器的实现? 链接失效了。但这确实:github.com/IdentityServer/IdentityServer4/blob/main/samples/…【参考方案2】:
var jwks = " keys: [..." // your jwks json string
var signingKeys = new JsonWebKeySet(jwks).GetSigningKeys();

然后只需将其分配给您的TokenValidationParametersIssuerSigningKeys 属性。

如果您是从 Web 服务读取 jwks,那么您需要一个 http 客户端首先读取它。

【讨论】:

以上是关于如何使用 JwtSecurityTokenHandler 和 JWKS 端点验证 JWT?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

WSARecv 如何使用 lpOverlapped?如何手动发出事件信号?