2014-02-10 73 views
36

我創建了一個基於角色的菜單,我遵循this教程。有些地方向下翻頁,你會看到這行代碼:asp.net身份獲取登錄用戶的所有角色

String[] roles = Roles.GetRolesForUser(); 

它返回當前登錄的用戶的所有角色。我想知道如何用新的ASP.NET Identity系統來實現這一點?

它還是很新的,沒有什麼可以找到它。

回答

71

Controller.User.IdentityClaimsIdentity。您可以通過檢查的權利要求得到角色的列表...

var roles = ((ClaimsIdentity)User.Identity).Claims 
       .Where(c => c.Type == ClaimTypes.Role) 
       .Select(c => c.Value); 

---更新---

打破下來一點更多...

using System.Security.Claims; 

// ........ 

var userIdentity = (ClaimsIdentity)User.Identity; 
var claims = userIdentity.Claims; 
var roleClaimType = userIdentity.RoleClaimType; 
var roles = claims.Where(c => c.Type == ClaimTypes.Role).ToList(); 

// or... 
var roles = claims.Where(c => c.Type == roleClaimType).ToList(); 
+0

根據這個文檔http://msdn.microsoft.com/en-us/library/system.identitymodel.claims.claimtypes%28v=vs.110%29.aspx,沒有'Role'在'ClaimTypes'中。我需要添加它還是什麼? – Quoter

+0

ASP.NET標識使用'System.Security.Claims.ClaimTypes' http://msdn.microsoft.com/en-us/library/system.security.claims.claimtypes(v=vs.110).aspx。此外,ClaimsIdentity對象還具有包含相同值的RoleClaimType屬性,您可以使用它。 –

+0

你可以更新你的答案,告訴我在代碼中看起來如何?嘗試了幾種方法,但我沒有看到'RoleClaimType'。 – Quoter

8

這是上述解決方案的擴展方法。

public static List<string> Roles(this ClaimsIdentity identity) 
    { 
     return identity.Claims 
         .Where(c => c.Type == ClaimTypes.Role) 
         .Select(c => c.Value) 
         .ToList(); 
    }