2017-02-03 12 views
7

私はASP.NETコアの初心者です。私は役割、主張とユーザーの関係に立ち往生しています。ASP.NETのコアアイデンティティの役割、クレームおよびユーザー

私はベンユーザーを持って、ユーザーは、管理ロールに属しています。 管理者ロールには、ビューページおよび編集ページデータベースがあります。

しかし、私は、そのユーザーに属することを主張し、役割を取得することはできません。

(コード内のコメントを参照してください)私の心の中で

var user = await _userManager.FindByNameAsync(applicationUser.UserName); 
if(user != null) { 
    var userClaims = await _userManager.GetClaimsAsync(user); // empty, WHY ? 
    var userRoles = await _userManager.GetRolesAsync(user); // ['admin'] 
    var adminRole = DbContext.Roles.FirstOrDefault(x => x.Name == "Admin"); 
    IList<Claim> adminClaims; 
    if(adminRole != null) 
    { 
     adminClaims = await _roleManager.GetClaimsAsync(adminRole); 
     // correct => ['view-page', 'edit-page'] 
    } 
    } 
} 

をユーザーがメンバーであるとき、私は理解して役割の主張を継承します。

  • ユーザー:

    デフォルトASP.NETアイデンティティは5つのテーブルを持っています。

  • 役割。
  • UserRoles - ユーザーは多くの役割を持つことができます。
  • RoleClaims - ロールは多くのクレームを持つことができます。
  • UserClaims - ユーザーは多くのクレームを持つことができます。

正しいと思いますか?なぜuserManager.GetClaimsAsync(user)が空白の要求を返すのですか?

提案がありますか?

答えて

5

なぜuserManager.GetClaimsAsync(user)が空白のクレームを返すのですか?

UserManager.GetClaimsAsync(user)UserClaimsテーブルを照会します。 と同じです。RoleManager.GetClaimsAsync(role)は、RoleClaimsテーブルを照会します。

ただし、ユーザーがロールのメンバーである場合、ASP.NET IDコアでは、ロールの要求を自動的に継承します。あなたは、コントローラのアクション内の例えば、ClaimsPrincipalを確認することができます。

var claims = User.Claims.ToList(); 

あなたはユーザーからClaimsPrincipalを作成UserClaimsPrincipalFactory.csのコードを見ることができます。私は最近、この問題に対処すると役割から来た特定の請求項によってユーザーの位置を特定する問題を解決しなければならなかった

+0

web apiでJWTを作成するというユーザークレームを取得する必要があります。そのため、トークンに有効なユーザークレーム/ロールが含まれていない場合、私はUser.Claimsを使用できません。そして私はUserManagerと思う。GetClaimsAsync(user)がUserRolesテーブルをクエリーするのは間違っています。まさにUserClaimsテーブルをクエリしています。あなたはこの状況について何か提案していますか? – trinvh

+0

@trinvh "UserManager.GetClaimsAsync(user)がUserRolesにクエリを実行しました"というエラーが修正されました。 – tmg

+0

上記のリンクのため正解とマークしました。誰もが、createAsyncメソッドを参照する必要があるという主張を取得したい – trinvh

0

は役割クレームから値を持つ新しいクレームオブジェクトを作成することです:

var role = await roleManager.FindByNameAsync(yourRoleName); 
if(role != null) 
{ 
    var roleClaims = await roleManager.GetClaimsAsync(role); 
    if(roleClaims != null && roleClaims.Count() > 0) 
    { 
     foreach(var claim in roleClaims.ToList()) 
     { 
      var users = await userManager.GetUsersForClaimAsync(new Claim(claim.Type, claim.Value)); 
      if(users != null && users.Count() > 0) 
      { 
       foreach(var user in users.ToList()) 
       { 
        //This is an example of only removing a claim, but this is the 
        //area where you could remove/add the updated claim 
        await userManager.RemoveClaimAsync(user, new Claim(claim.Type, claim.Value)); 
       } 
      } 
     } 
    } 
} 

これにより、クレームのあるロールを更新/削除し、ロールとクレームが割り当てられた再発行/削除対象のユーザーにその変更を渡すことができました。しかし、私はまだより少ないコードでよりエレガントに/簡単に何かを探しています。

関連する問題