如何在 Dot Net Core 中使用 JWKS 验证 JWT 令牌

Posted

技术标签:

【中文标题】如何在 Dot Net Core 中使用 JWKS 验证 JWT 令牌【英文标题】:How to validate JWT Token using JWKS in Dot Net Core 【发布时间】:2020-02-24 08:19:03 【问题描述】:

在 C# 中,我需要根据 JWKS(代表下面的一组键的 Json 对象)验证承载令牌

 
   "keys":[ 
       
         "e":"AQAB",
         "kid":"unique key",
         "kty":"RSA",
         "n":"some value"
      
   ]

【问题讨论】:

【参考方案1】:

您可以使用 Microsoft 的 Nuget 包 Microsoft.IdentityModel.TokensSystem.IdentityModel.Tokens.Jwt 来做到这一点

使用以下代码创建令牌验证器:

private static bool ValidateToken(string token, TokenValidationParameters validationParameters)

    var tokenHandler = new JwtSecurityTokenHandler();
    try
    
        tokenHandler.ValidateToken(token, validationParameters, out var validatedToken);
        return validatedToken != null;
    
    catch (Exception)
    
        return false;
    

为了使用,您必须加载 JWKS 并选择验证参数的键:

var jwksJson = @"
     
       ""keys"":[ 
           
             ""e"":""AQAB"",
             ""kid"":""unique key"",
             ""kty"":""RSA"",
             ""n"":""some value""
          
       ]
    ";

var token = "eyJhb...";
var jwks = new JsonWebKeySet(jwksJson);
var jwk = jwks.Keys.First();

var validationParameters = new TokenValidationParameters

    IssuerSigningKey = jwk,
    ValidAudience = "", // Your API Audience, can be disabled via ValidateAudience = false
    ValidIssuer = ""  // Your token issuer, can be disabled via ValidateIssuer = false
;

var isValid = ValidateToken(token, validationParameters);

【讨论】:

如果您不想使用第一个键怎么办 - 如果您想检查其中是否有任何一个被孩子匹配怎么办? @th3morg 您可以创建多个TokenValidationParameters 并验证它们中的每一个,或者您可以通过KeyId 属性选择JsonWebKey 仅适用于与@th3morg 有相同问题的其他人 - 请参阅***.com/a/64274938/419934,它向您展示了如何将密钥列表转换为正确的格式,然后可用于在 TokenValidationParameters 字段中设置 IssuerSigningKeys .

以上是关于如何在 Dot Net Core 中使用 JWKS 验证 JWT 令牌的主要内容,如果未能解决你的问题,请参考以下文章

如何使用jquery从dot net core mvc中的表中的下拉列表中显示选定的值

如何使用WEB API Dot net core实现文件上传?

Angular + core 如何将文件数组从 Angular 上传到 Dot Net Core

使用自包含框架时,dot net core 3.1 的设置 CI 构建配置失败

AWS Lambda Dot Net Core 3.1 在使用 Aspose Cells for .Net 时抛出 gdip 异常

dot net core 项目,在 site.js 中使用 jquery maxlength 和 count 插件