Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 如何使用JwtSecurityTokenHandler和JWKS端点验证JWT?_Asp.net_Oauth 2.0_Jwt_Openid Connect_Identityserver4 - Fatal编程技术网

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

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类型来提取密钥并执行验证

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

如果我能重建这种行为,那就太好了,如果可能的话,我想利用微软的实现。但是,我不知道如何利用通过IdentityServer的发现端点提供的
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的实现?链接不再工作。不过,这并不意味着: