2017-06-06 9 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; } 
} 

私が含まれるようにアイデンティティ・サーバー4を設定する場所、私は見ることができませんこれらの2つのプロパティは、請求コレクションです。私はアイデンティティ・サーバー4のサンプルのいくつかを見てきましたが、サンプルを見ることはできません。

これらの2つのユーザープロパティをgiven_namefamily_nameの主張にマッ​​ピングすることをお勧めします。

私は現在、通知に接続し、userinfoエンドポイント(ハイブリッドフロー?)を照会しています。したがって、これがアイデンティティ・サーバーの構成であるか、またはuserinfoエンドポイントのカスタマイズであるかどうかはわかりません。

答えて

0

私はなぜこれに関するドキュメントがないのだろうと思っていました。それは私がおそらくそれを間違っていることに気づくように導く。

ASP.NET IDの一部としてテーブルAspNetUserClaimsが作成されていません。クレームデータをここに追加し、請求データがprofileの一部として引き継がれます。私は追加AccountController.RegisterためPOST方法で

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]")); 

を、私は私のProfileServiceクラスを注入し、このようMyProfileService.GetProfileDataAsyncで主張を追加する依存関係によってaccess_tokenに請求を追加しました:

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作成したのは新しいリスト()です。 'HttpContext.Authentication.SignInAsync(user.SubjectId、user.Username、provider、props、additionalClaims.ToArray());を待つsampleseを見てください – 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

ありがとう、私はもう少しこれを見ていきます。 –

関連する問題