我的IUserClaimsPrincipalFactory实现导致IdentityServer4上出现StackOverflowException

时间:2017-01-07 17:24:43

标签: asp.net-core asp.net-identity identityserver4

我在Asp.NET Core上使用带有Asp.NET Core Identity的IdentityServer4构建了一个身份服务器。我想将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工厂时,我没有收到任何错误。

2 个答案:

答案 0 :(得分:4)

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

var principal = await CreateAsync(user);

CreateUser是你所在的函数,你再次以递归方式调用它,这会产生一个无限循环,因此堆栈溢出

答案 1 :(得分:2)

更改行

var principal = await CreateAsync(user);

 var principal = await base.CreateAsync(user);