ASP. NET Ядро: проверка токена JWT Auth0 - PullRequest
1 голос
/ 20 марта 2020

Я использую 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.

Как я могу проверить Auth0 idToken, используя JwtSecurityTokenHandler?

1 Ответ

1 голос
/ 20 марта 2020

Чтобы вручную проверить токен 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;

Источник: Проверка JWT вручную с помощью. NET

Кредит: @ Nkosi

...