Openiddict。将自定义声明保存到AspNetUserClaims表

时间:2018-05-04 13:31:08

标签: asp.net-core claims openiddict

我有一个基于openiddict 2.0的auth服务器。我需要的是添加自定义声明。经过一番搜索,我开始自定义实现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表中。我发现我可以通过以下方式直接将其添加到GenerateClaimsAsync方法来“解决”这个问题:

await UserManager.AddClaimAsync(user, customClaim);

现在我想知道它是正确的方法,还是有一些简单的配置步骤,也许像“选项”标志,我只需要在openiddict设置期间启用...

1 个答案:

答案 0 :(得分:1)

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

UserManager解决了商店的问题。它查找并保存数据库中的数据,允许异步实现。另一方面,ClaimsIdentity没有连接到商店。

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

持久声明的想法是,一旦持续存在,声明应自动添加到ClaimsIdentity中。您可能必须自己实现。