2016-11-16 39 views
5

我原型化使用IdentityServer4以确保多个服务的安全,并警告说这些服务可能不会被迁移(在可预见的将来)使用ASP.NET Core的OWIN中间件成语。因此,我不能利用许多中间件助手来自动化JWT的验证,只需提供IdentityServer的着名JWKS端点等等。如何使用JwtSecurityTokenHandler和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); 
} 

如何执行从JsonWebKeySet必要的翻译IEnumerable<SecurityKey>使可能发生的验证?除了OWIN中间件之外,还有其他方法可以使用上面的DiscoveryResponse数据吗?

(不幸的是,对于System.IdentityModel.Tokens.Jwt文件是不是最新的。)

回答

相关问题