2010-01-14 70 views
22

有什麼方法可以獲得用戶在我的控制器中顯式角色?這假定使用ASP.NET成員資格和角色提供者。 「IsInRole」不起作用 - 我需要真正獲得他們所在角色的名稱。獲取當前用戶的角色

回答

24

您可以從GetRoles方法中獲得角色列表。 (從鏈接)

string[] rolesArray; 

    public void Page_Load() 
    { 
     RolePrincipal r = (RolePrincipal)User; 
     rolesArray = r.GetRoles(); 
     ...//extra code 
    } 
+8

對於其他人誰碰上這一點,如果你對角色管理器遇到錯誤,這裏沒有被啓用,浮現在你的web配置,發現啓用roleManager元素,並將=」真「作爲屬性。 – MisterJames 2012-05-30 21:10:08

25

用戶可以在多個角色,所以你不能得到一個角色用戶是在,但你可以很容易地得到角色的的列表用戶在

可以使用Roles類型來獲得當前登錄的用戶是在角色列表:

public ActionResult ShowUserRoles() { 
    string[] roleNames = Roles.GetRolesForUser(); 
    return View(roleNames); 
} 

或者,如果你想獲得角色的任意用戶,您可以PA當您撥打Roles.GetRolesForUser()時,請在用戶名中輸入ss。

+0

以及如何獲得自定義用戶特定的數據,如DOB? – xameeramir 2015-05-13 12:11:02

+2

@zameeramir聽起來像是一個很好的單獨問題,可以在StackOverflow上詢問。 – Eilon 2015-05-13 15:58:47

+0

它在這裏:http://stackoverflow.com/questions/30216915/how-to-get-user-profile-data-from-asp-net-mvc-custom-identityuser-model/30217188#30217188 – xameeramir 2015-05-13 16:05:02

12

您可以使用Roles.GetRolesForUser()獲取當前用戶的角色。

要檢查如果用戶屬於這裏的角色是我做過什麼:

Roles.GetRolesForUser().Contains("Administrator") 
+6

你也可以通過執行'User.IsInRole(「RoleName」)來檢查用戶是否在角色中。 – 2013-05-01 07:19:44

+0

Scotty.NET的答案(在對此答案的評論中)似乎是一種更好(更快)的方式來檢查用戶是否屬於對我有一定的作用。 – VoidKing 2013-12-10 19:40:20

10

Simplemembership在MVC4:

獲取用戶的角色的

var role = System.Web.Security.Roles.GetRolesForUser().Single(); 

要檢查用戶屬於某個角色 -

if (User.IsInRole("External")) 
2

我不知道我是否錯過了一些奇怪的設置或設置,但我無法獲得User.IsInRoleRoles.GetRolesForUser()工作。我只是得到一個異常(我認爲空引用),並且應用程序剛剛停止。儘管我已經將RoleManager配置爲OwinContext和Create方法,就像Microsoft的Identity Sample項目中一樣,並且在web.config中啓用了角色管理器。 我解決了這個起初使用另一種方法,像這樣(db是ApplicationDbContext):

var UserID = User.Identity.GetUserId();  
var userRoles = db.Roles.Include(r => r.Users).ToList(); 

var userRoleNames = (from r in userRoles 
          from u in r.Users 
          where u.UserId == UserID 
          select r.Name).ToList(); 

這可能不是最優化的方式可能被改變爲simplier形式,但它爲我工作和可能不需要像其他方法那麼多的設置/依賴關係。 第二種方法是這樣(添加到您的控制器類):

private ApplicationDbContext db = new ApplicationDbContext(); 
    private ApplicationUserManager _userManager; 
    public ApplicationUserManager UserManager 
    { 
     get 
     { 
      return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
     } 
     set 
     { 
      _userManager = value; 
     } 
    } 

    private ApplicationRoleManager _roleManager; 
    public ApplicationRoleManager RoleManager 
    { 
     get 
     { 
      return _roleManager ?? HttpContext.GetOwinContext().Get<ApplicationRoleManager>(); 
     } 
     private set 
     { 
      _roleManager = value; 
     } 
    } 

內,您的控制器,你現在可以做如:

var UserID = User.Identity.GetUserId(); 
var RolesForUser = await UserManager.GetRolesAsync(UserID); 

我使用ASP.NET MVC 5應用程序只是爲了清楚。本例中沒有使用RoleManager,但它可以用於創建,查找,更新等角色。使用此方法可以使用await進行異步調用,以防止對您的應用程序有益。

0

我使用此代碼

((ClaimsIdentity)User.Identity).FindAll(ClaimTypes.Role).ToList() 
.OrderBy(x => x.Value == "admin" ? 1 
: x.Value == "Salesperson" ? 2 
: x.Value == "User" ? 3 : 4).First().Value