2010-01-14 113 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