【问题标题】:get current user's role获取当前用户的角色
【发布时间】:2011-01-05 07:44:37
【问题描述】:

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

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

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

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

    【讨论】:

    • 对于遇到此问题的其他人,如果您在此处遇到有关角色管理器未启用的错误,请弹出您的 Web 配置,找到 roleManager 元素并将 enabled="true" 设置为属性。
    • 什么是 RolePrincipal ?
    【解决方案2】:

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

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

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

    或者,如果您想获取任意用户的角色,您可以在调用 Roles.GetRolesForUser() 时传入用户名。

    【讨论】:

    • 以及如何获取自定义的用户特定数据,例如 DOB?
    • @zameeramir 这听起来像是在 StackOverflow 上提出的一个很好的单独问题。
    【解决方案3】:

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

    为了检查用户是否属于某个角色,这是我所做的:

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

    【讨论】:

    • 你也可以通过User.IsInRole("RoleName")来检查用户是否在角色中
    • Scotty.NET 的回答(在对此回答的评论中)似乎是一种更好(更快)的方式来检查用户是否属于我的某个角色。
    【解决方案4】:

    MVC4 中的简单成员:

    获取用户的角色-

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

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

    if (User.IsInRole("External"))
    

    【讨论】:

      【解决方案5】:

      我不知道我是否遗漏了一些奇怪的设置或设置,但我无法获得例如User.IsInRoleRoles.GetRolesForUser() 工作。我只是得到一个异常(我认为是空引用),应用程序就停止了。即使我在 Microsoft 的 Identity Sample 项目中为 OwinContext 和 Create 方法等配置了 RoleManager,并且在 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 进行异步调用,以防万一这对您的应用程序有利。

      【讨论】:

        【解决方案6】:

        我使用此代码

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

        【讨论】:

          【解决方案7】:

          如果您想获取任何用户的角色名称,那么只需在您要执行操作的控制器中使用以下两个函数。

          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];
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-04-17
            • 2014-03-09
            • 2020-11-23
            • 1970-01-01
            • 1970-01-01
            • 2018-11-07
            • 2013-02-07
            相关资源
            最近更新 更多