Asp.net 如何使用JwtSecurityTokenHandler和JWKS端点验证JWT?
我正在原型化使用IdentityServer4来保护几个服务,但要注意的是,这些服务可能不会(在可预见的将来)迁移到使用ASP.NET Core的OWIN中间件习惯用法。因此,我不能简单地通过提供众所周知的IdentityServer的JWKS端点来利用许多中间件助手来自动化JWT的验证 如果我能重建这种行为,那就太好了,如果可能的话,我想利用微软的实现。但是,我不知道如何利用通过IdentityServer的发现端点提供的Asp.net 如何使用JwtSecurityTokenHandler和JWKS端点验证JWT?,asp.net,oauth-2.0,jwt,openid-connect,identityserver4,Asp.net,Oauth 2.0,Jwt,Openid Connect,Identityserver4,我正在原型化使用IdentityServer4来保护几个服务,但要注意的是,这些服务可能不会(在可预见的将来)迁移到使用ASP.NET Core的OWIN中间件习惯用法。因此,我不能简单地通过提供众所周知的IdentityServer的JWKS端点来利用许多中间件助手来自动化JWT的验证 如果我能重建这种行为,那就太好了,如果可能的话,我想利用微软的实现。但是,我不知道如何利用通过IdentityServer的发现端点提供的JsonWebKeySet和JsonWebKey类型来提取密钥并执行验证
JsonWebKeySet
和JsonWebKey
类型来提取密钥并执行验证
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);
}
JwtSecurityTokenHandler
用于验证JWT,这些参数需要一个或多个对象的实例来执行验证
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);
}
如何执行从JsonWebKeySet
到IEnumerable
的必要转换,以便进行验证?是否有其他方法(除了OWIN中间件)也可以使用上面的DiscoveryResponse
数据
(遗憾的是,System.IdentityModel.Tokens.Jwt
的文档不是最新的。)检查此示例:
它从JWK中手动检索密钥并填充验证参数
var jwks = "{ keys: [..." // your jwks json string
var signingKeys = new JsonWebKeySet(jwks).GetSigningKeys();
然后,只需将其分配给TokenValidationParameters
的issueSigningKeys
属性即可
如果您正在从web服务读取jwks,那么您需要一个http客户端来首先读取它。这太棒了,谢谢!我忽略了示例,在浏览中间件实现的源代码时迷失了方向:)任何没有Identity Server的实现?链接不再工作。不过,这并不意味着: