自定义ASP.NET标识

Adr*_*ips 0 identityserver4

我正在使用Identity Server 4,我已经自定义了我的ASP.NET Identity用户,如下所示:

public class ApplicationUser : IdentityUser
{
    [MaxLength(100)]
    public virtual string FirstName { get; set; }

    [MaxLength(100)]
    public virtual string LastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我无法看到我将Identity Server 4配置为在声明集合中包含这两个属性的位置.我已经查看了一些Identity Server 4示例,但看不到任何示例.

理想情况下,我希望将这两个用户属性映射到声明given_namefamily_name声明.

我正在联系通知并查询userinfo端点(混合流?).所以我不确定这是Identity Server的配置还是userinfo端点的自定义?

小智 5

为了包含您的自定义声明,您需要GetProfileDataAsync()使用以下方法实现自己的方法IProfileService.每次请求用户声明时都会调用此方法.

这是我对IProfileService的实现.

public class CustomProfileService : IProfileService
{
    private readonly UserManager<User> _userManager;

    public CustomProfileService(UserManager<User> userManager)
    {
        _userManager = userManager;
    }

    public async Task GetProfileDataAsync(ProfileDataRequestContext context)
    {
        var subjectId = context.Subject.GetSubjectId();
        var user = await _userManager.FindByIdAsync(subjectId);

        if (user == null) return;

        var claims = new List<Claim>
        {
            new Claim("username", user.UserName),
            new Claim("email", user.Email),
            new Claim("firstname", user.FirstName),
            new Claim("lastname", user.LastName)
        };

        var roles = await _userManager.GetRolesAsync(user);
        foreach (var role in roles)
        {
            claims.Add(new Claim("role", role));
        }

        var userClaims = await _userManager.GetClaimsAsync(user);
        foreach (var userClaim in userClaims)
        {
            claims.Add(new Claim(userClaim.Type, userClaim.Value));
        }

        context.IssuedClaims = claims;
    }

    public async Task IsActiveAsync(IsActiveContext context)
    {
        var user = await _userManager.FindByIdAsync(context.Subject.GetSubjectId());
        context.IsActive = user.IsActive;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你必须添加以下这一行 Startup.ConfigureServices()

services.AddScoped<IProfileService, CustomProfileService>();

  • 这看起来是完美的解决方案,但我看不到我的自定义配置文件服务被调用过。在 ctor 和所有方法上添加断点 - 没有(是的 - 它在 DI 中正确连接) (2认同)