Asp.net-Core

ASP.NET Core 身份角色、聲明和使用者

  • April 28, 2020

我是 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.csClaimsPrincipal中查看從使用者創建 a的程式碼。

引用自:https://stackoverflow.com/questions/42024218