私は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つのテーブルがあります。
私は正しいと思いますか?なぜuserManager.GetClaimsAsync(user)が空のクレームを返すのですか?
なにか提案を?
なぜuserManager.GetClaimsAsync(user)が空のクレームを返すのですか?
UserManager.GetClaimsAsync(user)
はUserClaims
テーブルを照会するためです。 RoleManager.GetClaimsAsync(role)
クエリについても同じです。RoleClaims
テーブル。
ただし、ユーザーがロールのメンバーである場合のASP.NET Identity Coreの設計により、ユーザーは自動的にロールのクレームを継承します。 ClaimsPrincipal
は、たとえばコントローラーアクション内で確認できます。
var claims = User.Claims.ToList();
serClaimsPrincipalFactory.cs で、ユーザーからClaimsPrincipal
を作成するコードを確認できます。
私は最近この問題に対処する必要があり、ロールからの特定のクレームによってユーザーを特定する問題を解決するには、ロールクレームの値で新しいクレームオブジェクトを作成します。
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));
}
}
}
}
}
これにより、クレームのあるロールを更新/削除し、ロールとクレームが割り当てられた変更を再発行/削除するユーザーに渡すことができました。しかし、私はまだより少ないコードでよりエレガントで簡単なものを探しています。