获得当前用户的角色

时间:2010-01-14 23:58:29

标签: asp.net-mvc

有没有办法在我的控制器中获得用户所属的显式角色?这假定使用ASP.NET成员资格和角色提供程序。 “IsInRole”不起作用 - 我需要实际获取它们所在角色的名称。

7 个答案:

答案 0 :(得分:27)

用户可以在多个角色中,因此您无法获得该用户所在的一个角色,但您可以轻松获取角色的列表用户在。

您可以使用Roles类型获取当前登录用户所在的角色列表:

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

或者,如果您想获得任意用户的角色,可以在致电Roles.GetRolesForUser()时传递用户名。

答案 1 :(得分:26)

您可以从GetRoles方法获取角色列表。 (来自链接)

  string[] rolesArray;

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

答案 2 :(得分:14)

MVC4中的简单会员:

获得用户的角色 -

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

检查用户是否属于某个角色 -

if (User.IsInRole("External"))

答案 3 :(得分:13)

您可以使用Roles.GetRolesForUser()获取当前用户的角色。

要检查用户是否属于某个角色,请执行以下操作:

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

答案 4 :(得分:3)

我不知道我是否错过了一些奇怪的设置或设置,但我无法得到工作User.IsInRoleRoles.GetRolesForUser()。我只是得到一个异常(我认为是null引用),应用程序就停止了。即使我已将RoleManager配置为OwinContext和Create方法等,如Microsoft的Identity Sample项目,以及web.config中启用的Role Manager。 我最初使用另一种方法解决了这个问题,比如这样(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();

这可能不是最优化的方式,并且可以更改为更简单的形式,但它对我有用,并且可能不需要与其他方法一样多的设置/依赖性。 第二种方法是这个(将其添加到您的控制器类):

    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进行异步调用,以防对应用程序有益。

答案 5 :(得分: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

答案 6 :(得分:0)

如果要获取任何用户的角色名称,则只需在要执行操作的控制器中使用以下两个功能。

public ApplicationSignInManager SignInManager
        {
            get { return _signInManager ?? HttpContext.GetOwinContext().Get<ApplicationSignInManager>(); }
            private set { _signInManager = value; }
        }

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

,然后在操作中,使用以下行。

var role = UserManager.GetRoles(UserId);

请注意,此处的UserId是ApplicationUser的ID。

此角色将为IList

如果您的应用程序逻辑使得用户只能担任一个角色,则可以通过

进行访问
string roleName = role[0];