Asp.net-Core
ASP.NET Core 身份角色、聲明和使用者
我是 ASP.NET Core 初學者。我被困在角色、聲明和使用者關係中。
我有一個使用者Ben,使用者屬於Admin角色。管理員角色在數據庫中有聲明查看頁面和編輯頁面。
但我無法獲得屬於該使用者的聲明和角色:
(請參閱程式碼中的註釋)
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) 返回空聲明?
有什麼建議嗎?
為什麼 userManager.GetClaimsAsync(user) 返回空聲明?
因為
UserManager.GetClaimsAsync(user)查詢UserClaims表。查詢 表RoleManager.GetClaimsAsync(role)也是RoleClaims如此。但是根據 ASP.NET Identity Core 的設計,當使用者是角色的成員時,他們會自動繼承角色的聲明。您可以檢查
ClaimsPrincipal, 例如在控制器操作中:var claims = User.Claims.ToList();您可以在UserClaimsPrincipalFactory.cs
ClaimsPrincipal中查看從使用者創建 a的程式碼。