【问题标题】:ASP.NET Core: validating Auth0's JWT tokenASP.NET Core:验证 Auth0 的 JWT 令牌
【发布时间】:2020-07-01 01:22:10
【问题描述】:

我正在使用 Auth0 并像这样解析它的 idToken 服务器端:

    var tokenHandler = new JwtSecurityTokenHandler();
    var jwtToken = tokenHandler.ReadJwtToken(idToken); // idToken comes from client using auth0.js
    var sub = jwtToken.Claims.First(claim => claim.Type == "sub").Value;

上面的代码运行良好,我能够成功解析idToken,但我想在信任它之前验证idToken,所以我试过这个:

        string clientSecret = "{client_secret}"; // comes from Auth0 application's client secret
        var validations = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = "some value", // used "iss" from here: https://jwt.io/
            ValidAudience = "some value", // used "aud" from here: https://jwt.io/
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(clientSecret)),
        };

        var principal = tokenHandler.ValidateToken(idToken, validations, out var validatedToken);

在尝试验证令牌时,会导致以下异常:

Microsoft.IdentityModel.Tokens.SecurityTokenSignatureKeyNotFoundException
  HResult=0x80131500
  Message=IDX10501: Signature validation failed. Unable to match key: 
kid: '[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]'

我通过在此处解析其中一个标记来获取发行者和受众的价值:https://jwt.io/。客户端密码是我的应用程序在 Auth0 的客户端密码。

如何使用 JwtSecurityTokenHandler 验证 Auth0 的 idToken

【问题讨论】:

  • @Nkosi 这正是我想要的。您可以发布该链接作为答案吗?我会把它标记为正确的。谢谢!
  • 我建议添加您必须工作的内容作为自我回答,并参考该文章以帮助将来可能遇到此问题的其他人。
  • @JohnnyOshika - 如果你能更新你如何解决这个问题,我会很高兴据我了解,你应该找到一种方法来设置 Auth0 的“issuerSigningKey”,然后“ValidateIssuerSigningKey”应该可以工作
  • @TGN12 在下面查看我的答案...

标签: c# .net-core jwt token auth0


【解决方案1】:

要手动验证 Auth0 的 JWT 令牌,您需要以下 2 个 Nuget 包:

System.IdentityModel.Tokens.Jwt
Microsoft.IdentityModel.Protocols.OpenIdConnect

然后从 Auth0 的应用设置中获取这些值

string auth0Domain = ""; // Note: if your Domain is foo.auth0.com, this needs to be https://foo.auth0.com/
string auth0ClientId = "";

验证 Auth0 的令牌如下:

IConfigurationManager<OpenIdConnectConfiguration> configurationManager = new ConfigurationManager<OpenIdConnectConfiguration>($"{auth0Domain}.well-known/openid-configuration", new OpenIdConnectConfigurationRetriever());
OpenIdConnectConfiguration openIdConfig = await configurationManager.GetConfigurationAsync(CancellationToken.None);

var validations = new TokenValidationParameters
{
    ValidIssuer = auth0Domain,
    ValidAudiences = new[] { auth0ClientId },
    IssuerSigningKeys = openIdConfig.SigningKeys
};

var user = tokenHandler.ValidateToken(idToken, validations, out var validatedToken);

使用经过验证的令牌,您可以像这样提取有用的信息:

var securityToken = (JwtSecurityToken)validatedToken;
var userId = user.Claims.First(c => c.Type == ClaimTypes.NameIdentifier).Value;

来源:Manually validating a JWT using .NET

信用:@Nkosi

【讨论】:

  • 为什么要手动而不使用“ValidateIssuerSigningKey”?
  • 这可以追溯到一年前,但我认为这是因为我无法让ValidateIssuerSigningKey 工作。请参阅上面的原始问题。
猜你喜欢
  • 2020-08-22
  • 2020-09-04
  • 2017-03-22
  • 2021-12-17
  • 2019-10-20
  • 1970-01-01
  • 2021-06-27
  • 2018-08-30
  • 2017-10-26
相关资源
最近更新 更多