我使用IdentityServer4和Asp.NET Core Identity在Asp.NET Core上构建了一个身份验证服务器。我希望将我的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);
这里你正在递归调用该方法直到堆栈溢出。 你可能想要调用一些不同的东西,比如UserManager或Repository? (译者注:原文中的“calling something different”意为“调用其他方法”,并没有指具体的方法名称) - Tseng