web-dev-qa-db-ja.com

ASP.NETコアIDの役割、クレーム、およびユーザー

私はASP.NET Coreの初心者です。私は役割、主張、ユーザー関係で立ち往生しています。

私にはユーザーがいますBen、ユーザーはAdminロールに属しています。 Adminロールにクレームがありますview-pageおよびedit-pageデータベース内。

しかし、そのユーザーに属しているクレームとロールを取得できません。

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

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 Identityには5つのテーブルがあります。

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

私は正しいと思いますか?なぜuserManager.GetClaimsAsync(user)が空のクレームを返すのですか?

なにか提案を?

12
trinvh

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

UserManager.GetClaimsAsync(user)UserClaimsテーブルを照会するためです。 RoleManager.GetClaimsAsync(role)クエリについても同じです。RoleClaimsテーブル。

ただし、ユーザーがロールのメンバーである場合のASP.NET Identity Coreの設計により、ユーザーは自動的にロールのクレームを継承します。 ClaimsPrincipalは、たとえばコントローラーアクション内で確認できます。

var claims = User.Claims.ToList();

serClaimsPrincipalFactory.cs で、ユーザーからClaimsPrincipalを作成するコードを確認できます。

7
tmg

私は最近この問題に対処する必要があり、ロールからの特定のクレームによってユーザーを特定する問題を解決するには、ロールクレームの値で新しいクレームオブジェクトを作成します。

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));
                }
            }
        }
    }
}

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

1
Wayne Davis