我原型化使用IdentityServer4以确保多个服务的安全,并警告说这些服务可能不会被迁移(在可预见的将来)使用ASP.NET Core的OWIN中间件成语。因此,我不能利用许多中间件助手来自动化JWT的验证,只需提供IdentityServer的着名JWKS端点等等。如何使用JwtSecurityTokenHandler和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);
}
如何执行从JsonWebKeySet
必要的翻译IEnumerable<SecurityKey>
使可能发生的验证?除了OWIN中间件之外,还有其他方法可以使用上面的DiscoveryResponse
数据吗?
(不幸的是,对于System.IdentityModel.Tokens.Jwt
文件是不是最新的。)
这太棒了 - 谢谢!我忽略了这些示例,并在浏览中间件实现的源代码时迷失了方向:) –