首页 > 解决方案 > 令牌验证后更新对委托人的声明

问题描述

我有使用 JWTBearerAuthentication 的 API。从身份验证的角度来看,一切正常。但是,验证完成后需要更新主体上的声明。我必须获取一些信息,而不是从源(令牌)声明中接收。我在想是否有一种方法可以在验证成功后向现有声明身份/主体添加一些声明以执行一些访问权限。以下是我的启动课程中的示例代码。

        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;
                    }
                }
                
            });

标签: owinopenidjwt-auth

解决方案


您有几个选项可以在身份验证后修改声明:

一种选择是

 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>();

推荐阅读