13

我明白,我可以使用的權利要求進行陳述有關用戶:ASP.NET身份「基於角色的」索賠

var claims = new List<Claim>(); 
claims.Add(new Claim(ClaimTypes.Name, "Peter")); 
claims.Add(new Claim(ClaimTypes.Email, "[email protected]")); 

但是我應該如何儲存「基於角色的」索賠?例如:

該用戶是超級管理員。

claims.Add(new Claim("IsSuperAdmin, "true")); 

值參數 「真」 的感覺完全是多餘的。如何使用索賠來表達此聲明?

回答

20

這已經爲您框架進行存儲的角色。當用戶登錄時,所有用戶角色將作爲聲明類型爲ClaimTypes.Role的聲明添加,值爲角色名稱。

而當您執行IPrincipal.IsInRole("SuperAdmin")時,框架實際會檢查用戶是否存在類型爲ClaimTypes.Role和值爲SuperAdmin的索賠。

所以不需要做任何特別的事情。只需將用戶添加到角色即可。

+0

Role類型的索賠與AspNetRoles表之間的關係是什麼? – mayu 2016-06-21 01:35:11

+0

@Tymski AspNetRoles包含角色列表。當用戶登錄時,所有這些角色都會作爲'ClaimTypes.Role'類型的聲明添加到cookie中。 Cookie中的聲明是短暫的。數據庫中的記錄只是複製到cookie中。 – trailmax 2016-06-21 09:05:31

+0

我應該指出,當搜索匹配的聲明時,'IPrincipal.IsInRole(「xx」)'不一定使用'ClaimTypes.Role'。例如,在Windows認證之後你可能會收到'WindowsPrincipal'實際上使用'ClaimTypes.GroupSid'來指定角色。而是使用'ClaimsIdentity.RoleClaimType'屬性。 – Rob 2016-10-14 14:54:26

11

您可以使用ClaimType Role

claims.Add(new Claim(ClaimTypes.Role, "SuperAdmin")); 
+1

我在上面做了註釋,但它在這裏也適用:在添加角色時使用'ClaimsIdentity.RoleClaimType'屬性會更可靠。 – Rob 2016-10-14 15:00:41

+0

不止一個角色呢? – 2016-12-15 18:37:39

+0

逗號分隔?多個相同類型的聲明?其他? – 2016-12-15 18:53:00

1

您需要在ClaimType.Role類型的索賠中指定角色,然後指定包含ClaimsIdentity中的角色的索賠類型,如下所示。

var claimsIdentity = new ClaimsIdentity(new[] 
{ 
    new Claim(ClaimTypes.Email, "[email protected]"), 
    new Claim(ClaimTypes.Name, "Peter"), 
    new Claim(ClaimTypes.Role, "SuperAdmin"), 
}, 
"ApplicationCookie", ClaimTypes.Email, ClaimTypes.Role); 

這將允許您在控制器中使用[Authorize(Roles = "SuperAdmin")]屬性。