【发布时间】:2017-01-07 17:24:43
【问题描述】:
我在 Asp.NET Core 上使用 IdentityServer4 和 Asp.NET Core Identity 构建了一个身份服务器。我想将我的 ApplicationUser 的属性映射到客户端访问 UserInfoEndpoint 时发送的声明。
我尝试按如下方式实现 IUserClaimsPrincipalFactory:
public class CustomUserClaimsPrincipalFactory : IUserClaimsPrincipalFactory<ApplicationUser>
{
public async Task<ClaimsPrincipal> CreateAsync(ApplicationUser user)
{
var principal = await CreateAsync(user);
((ClaimsIdentity)principal.Identity).AddClaims(new[] {
new Claim(ClaimTypes.GivenName, user.FirstName),
new Claim(ClaimTypes.Surname, user.LastName),
});
return principal;
}
}
并像这样注册它:
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders()
.AddClaimsPrincipalFactory<CustomUserClaimsPrincipalFactory>();
但是当客户端尝试访问 UserInfoEndpoint 时,我收到了 StackOverflowException。
你能帮我解决这个问题吗?
注意:我测试了它,当我不注册 ClaimsPrincipal 工厂时,我没有收到任何错误。
【问题讨论】:
-
var principal = await CreateAsync(user);您正在递归调用该方法,直到堆栈已满。您可能想在这里调用一些不同的东西,一些用户管理器或存储库?
标签: c# asp.net-core asp.net-identity identityserver4