ASP核心将自定义声明添加到身份验证令牌

Zeu*_*s82 3 authentication asp.net-core

我正在使用openiddict和ASP Identity,并且尝试将“ GroupId”添加为登录时返回的身份验证令牌的声明(使用/ connect / token端点-请参见下面的示例)。GroupId是我的AplicationUser类中的一个属性。

我尝试使用,IClaimsTransformer但似乎很笨拙,我无法轻松地从ClaimsTransformationContext进入UserManager。

我该如何通过自己的DI获得UserManager IClaimsTransformer或将GroupId添加到在连接/令牌端点生成的令牌中呢?

我遵循示例来设置网站。这是我想做的:

var groupGuid = User.Claims.FirstOrDefault(c => c.Type == "GroupGuid");
Run Code Online (Sandbox Code Playgroud)

小智 5

有两种方法可以实现它:
首先,CreateUserPrincipalAsync在您的定制中覆盖方法SignInManager

public override async Task<ClaimsPrincipal> CreateUserPrincipalAsync(ApplicationAdmin user)
{
    var principal = await base.CreateUserPrincipalAsync(user);
    // use this.UserManager if needed
    var identity = (ClaimsIdentity)principal.Identity;
    identity.AddClaim(new Claim("MyClaimType", "MyClaimValue"));            

    return principal;
}
Run Code Online (Sandbox Code Playgroud)

第二种方法是覆盖CreateAsync自定义方法UserClaimsPrincipalFactory

public override async Task<ClaimsPrincipal> CreateAsync(ApplicationUser user)
{
    var principal = await base.CreateAsync(user);

    var identity = (ClaimsIdentity)principal.Identity;
    identity.AddClaim(new Claim("MyClaimType", "MyClaimValue"));

    return principal;
}
Run Code Online (Sandbox Code Playgroud)

基本上是一样的,因为base.CreateUserPrincipalAsync方法在内部SignInManager调用this.UserClaimsPrincipalFactory()

不要忘记您的自定义实现加入到服务:
无论是

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddSignInManager<CustomSignInManager>();
}
Run Code Online (Sandbox Code Playgroud)

要么

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, CustomClaimsPrincipalFactory>();
}
Run Code Online (Sandbox Code Playgroud)