开迪迪克特。将自定义声明保存到 AspNetUserClaims table

Openiddict. Save custom claim to AspNetUserClaims table

我有一个基于 openiddict 2.0 的授权服务器。我需要的是添加自定义声明。经过一番搜索,我来到了 UserClaimsPrincipalFactory:

的自定义实现
public class CustomUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser, IdentityRole>
{
    public CustomUserClaimsPrincipalFactory(
        UserManager<ApplicationUser> userManager,
        RoleManager<IdentityRole> roleManager,
        IOptions<IdentityOptions> optionsAccessor)
        : base(userManager, roleManager, optionsAccessor)
    {
    }

    protected override async Task<ClaimsIdentity> GenerateClaimsAsync(ApplicationUser user)
    {
        var customClaim = new Claim("demo", "some value");

        var identity = await base.GenerateClaimsAsync(user);
        identity.AddClaim(customClaim);            
        return identity;
    }
}

它有效,并且 "demo" 声明已添加到令牌中,并且在 User.Claims 中可以从控制器操作中获得(我正在使用 OAuth2 验证中间件)。唯一令人困惑的是带有该声明的记录没有添加到 AspNetUserClaims table。我发现我可以通过直接将它添加到 GenerateClaimsAsync 方法来 "fix" 这个:

await UserManager.AddClaimAsync(user, customClaim);

现在我想知道它是正确的方法,还是有一些简单的配置步骤,可能类似于 "option" 标志,我只需要在 openiddict 设置期间启用...

您正在两个不同级别添加声明。

UserManager 寻址商店。它在数据库中查找并保存数据,允许异步实现。另一方面,ClaimsIdentity 未连接到商店。

虽然两者都有 AddClaim 方法,但 UserManager 实际上会保留数据,而 ClaimsIdentity 则不会。

持久化声明的想法是,一旦持久化,声明就会自动添加到您的 ClaimsIdentity 中。您可能需要自己实施。