自定义ASP.NET标识

时间:2017-06-06 14:30:26

标签: identityserver4

我使用的是Identity Server 4,并且我已按照以下方式自定义了我的ASP.NET身份用户:

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

    [MaxLength(100)]
    public virtual string LastName { get; set; }
}

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

我非常希望将这两个用户属性映射到given_namefamily_name声明。

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

3 个答案:

答案 0 :(得分:5)

要包含自定义声明,您需要使用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; } } 方法。每次请求用户声明时都会调用此方法。

这是我对IProfileService的实现。

Startup.ConfigureServices()

然后您必须将以下行添加到services.AddScoped<IProfileService, CustomProfileService>();

undefined

答案 1 :(得分:1)

我想知道为什么没有这方面的文件。这让我意识到我可能做错了。

我没有看到作为ASP.NET身份的一部分创建的表AspNetUserClaims。我将声明数据添加到此处,声明数据作为profile的一部分提供。

POST的{​​{1}}方法中,我添加了:

AccountController.Register

答案 2 :(得分:0)

这就是我所做的:在AccountController.ExternalLoginCallback中我添加了这个:

//Add claim even if client didn't ask for it
additionalClaims.Add(new Claim(JwtClaimTypes.Email, "email@email.com"));

然后我通过依赖注入我的access_token类并在ProfileService中添加声明,将MyProfileService.GetProfileDataAsync声明添加到public Task GetProfileDataAsync(ProfileDataRequestContext context) { var claims = new List<Claim>(); Claim emailClaim = context.Subject.Claims.Where<Claim>(claim => claim.Type.Equals(JwtClaimTypes.Email)).FirstOrDefault(); if (emailClaim != null) { claims.Add(emailClaim); } context.IssuedClaims = claims; return Task.FromResult(0); }

text-align