我的 IUserClaimsPrincipalFactory 实现在 IdentityServer4 上导致 StackOverflowException

My IUserClaimsPrincipalFactory implementation is causing StackOverflowException on IdentityServer4

我使用 IdentityServer4 和 Asp.NET 核心上的 Asp.NET 核心身份构建了一个身份服务器。我想将我的 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 时我收到 WhosebugException。

你能帮我解决这个问题吗?

注意:我测试了它,当我没有注册 ClaimsPrincipal 工厂时,我没有得到任何错误。

这行不是递归的吗,函数在无限循环中递归调用自己

var principal = await CreateAsync(user);

CreateUser 是您所在的函数,您再次递归调用它会创建一个无限循环,因此堆栈溢出

首先,换行

public class CustomUserClaimsPrincipalFactory : IUserClaimsPrincipalFactory<ApplicationUser>

public class CustomUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser,IdentityRole>

然后,更改行

var principal = await CreateAsync(user);

 var principal = await base.CreateAsync(user);