Обновлять претензии к участнику после проверки токена

#owin #openid #jwt-auth

#owin #OpenID #jwt

Вопрос:

У меня есть API, который использует JWTBearerAuthentication. С точки зрения аутентификации все работает нормально. Однако существует необходимость обновить утверждения для участника после завершения проверки. Есть некоторая информация, которую я должен извлечь вместо получения из исходных (токеновых) претензий. Я подумал, есть ли способ, чтобы после успешной проверки я мог добавить некоторые претензии к существующим удостоверениям / принципалу для выполнения некоторых действий с правами доступа. Ниже приведен пример кода в моем стартовом классе.

         app.UseJwtBearerAuthentication(
            new JwtBearerAuthenticationOptions
            {
                TokenHandler = new ValidateJwtSecurityTokenHandlerforLogs(_loggingService, _environment),
                AuthenticationMode = AuthenticationMode.Active,
                
                TokenValidationParameters = new TokenValidationParameters()
                {
                    NameClaimType = JwtClaimTypes.Name, 
                    RoleClaimType = OpenIDConfiguration.Permission, 
                    ValidateAudience = false, 
                    ValidIssuer = authority,
                    
                    
                    IssuerSigningKeyResolver = (token, securityToken, identifier, parameters) =>
                    {
                        var discoveryDocument = Task.Run(() => configurationManager.GetConfigurationAsync()).GetAwaiter().GetResult();
                        return discoveryDocument.SigningKeys;
                    }
                }
                
            });
  

Ответ №1:

У вас есть несколько вариантов изменения утверждений после аутентификации:

Одним из вариантов является

  options.Events = new JwtBearerEvents()
    {
        OnTokenValidated = context =>
        {
            // Token has passed validation and a ClaimsIdentity has been generated.
            context.Principal.Identities.First().AddClaim(new Claim("VIPCustomer", "YES"));
            return Task.CompletedTask;
        }
};
  

Чтобы включить более сложные сценарии преобразования утверждений, мы можем добавить пользовательский класс преобразования

 public class BonusLevelClaimTransformation : IClaimsTransformation
{
    public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
    {
        if (!principal.HasClaim(c => c.Type == "bonuslevel"))
        {
            //Lookup bonus level.....
            principal.Identities.First().AddClaim(new Claim("bonuslevel", "12345"));
        }
        return Task.FromResult(principal);
    }
}
  

Затем мы регистрируем его в Startup.cs:

 services.AddTransient<IClaimsTransformation, BonusLevelClaimTransformation>();
  

Комментарии:

1. По какой-то причине я не могу добавить первый вариант в свой проект MVC. Также второй вариант добавляет претензии, но не сохраняет их. Не уверен, что я чего-то не хватает. Есть ли у вас какой-либо рабочий пример, где это интегрировано.

2. Используете ли вы classic ASP.NET MVC или ASP.NET Ядро? в моем примере используется ASP.NET ядро.