2017-06-06 96 views
0

我使用的Identity Server 4,我已经定制了自己的ASP.NET用户身份如下:自定义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包括索赔集合中的这2个属性。我浏览了一些Identity Server 4示例,但看不到任何示例。

我理想上喜欢将这两个用户属性映射到given_namefamily_name声明。

我目前连接到通知并查询userinfo端点(混合流?)。所以我不确定这是配置Identity Server还是定制userinfo端点?

回答

0

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

我没有看到作为ASP.NET Identity的一部分创建的表AspNetUserClaims。我在此处添加了我的索赔数据,索赔数据作为profile的一部分进行了抽取。

在为AccountController.RegisterPOST方法我说:

var givenNameClaim = new IdentityUserClaim<string>() 
{ 
    ClaimType = "given_name", 
    ClaimValue = model.FirstName 
}; 

var familyNameClaim = new IdentityUserClaim<string>() 
{ 
    ClaimType = "family_name", 
    ClaimValue = model.LastName 
}; 

var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; 
user.Claims.Add(givenNameClaim); 
user.Claims.Add(familyNameClaim); 
0

这里是我做了什么:在AccountController.ExternalLoginCallback我加了这一点:

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

然后我用的依赖增加了要求到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); 
} 
+0

谢谢你,在哪里呢'additionalClaims'从何而来,它不是在我的方法或控制器声明? –

+0

@AdrianThompsonPhillips这只是一个'新清单()'我创建的。看看在哪里'await HttpContext.Authentication.SignInAsync(user.SubjectId,user.Username,provider,props,additionalClaims.ToArray());'被称为 – moritzg

4

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

这是我的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; 
    } 
} 

然后,你将不得不这样添加下面一行到Startup.ConfigureServices()

services.AddScoped<IProfileService, CustomProfileService>();

+0

谢谢,我会多看看这个。 –

相关问题