我有一个基于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设置期间启用...
答案 0 :(得分:1)
您正在两个不同级别添加声明。
UserManager解决了商店的问题。它查找并保存数据库中的数据,允许异步实现。另一方面,ClaimsIdentity没有连接到商店。
虽然两者都有AddClaim方法,但UserManager实际上会保留数据,而ClaimsIdentity则没有。
持久声明的想法是,一旦持续存在,声明应自动添加到ClaimsIdentity中。您可能必须自己实现。