2016-11-16 7 views
5

Я создаю прототип IdentityServer4 для защиты нескольких сервисов с предостережением о том, что эти службы, скорее всего, не будут перенесены (в обозримом будущем) на использование идиомы промежуточного программного обеспечения OWIN для ASP.NET Core. Следовательно, я не могу использовать множество помощников промежуточного программного обеспечения, которые автоматизируют проверку JWT, просто предоставляя, среди прочего, известную конечную точку JWKS IdentityServer.Как проверить JWT с помощью JwtSecurityTokenHandler и конечной точки JWKS?

Было бы хорошо, если бы я смог восстановить это поведение, и я хотел бы использовать реализацию Microsoft JwtSecurityTokenHandler, если это возможно. Однако я не могу понять, как использовать типы JsonWebKeySet и JsonWebKey, предоставляемые через конечную точку обнаружения IdentityServer, для извлечения ключей и выполнения проверки.

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 не в курсе.)

ответ

5

Проверить этот пример:

https://github.com/IdentityServer/IdentityServer4.Samples/blob/dev/Clients/src/MvcManual/Controllers/HomeController.cs#L81

Он вручную извлекает ключ из JWK и заселяет параметры проверки.

+2

Это фантастика - спасибо! Я забыл образцы и терялся при навигации исходного кода реализации промежуточного программного обеспечения :) –