получить роль текущего пользователя - PullRequest
29 голосов
/ 15 января 2010

Есть ли способ получить явную роль, к которой принадлежит пользователь, в моем контроллере? Это предполагает использование членства в ASP.NET и поставщиков ролей. «IsInRole» не работает - мне нужно получить название роли, в которой они находятся.

Ответы [ 6 ]

27 голосов
/ 15 января 2010

Пользователь может иметь несколько ролей, поэтому вы не можете получить роль one , в которой находится пользователь, но вы можете легко получить список ролей пользователя. находится в.

Вы можете использовать тип Roles, чтобы получить список ролей, в которых находится пользователь, вошедший в данный момент:

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

Или, если вы хотите получить роли для произвольного пользователя, вы можете передать имя пользователя при вызове Roles.GetRolesForUser().

27 голосов
/ 15 января 2010

Список ролей можно получить с помощью метода GetRoles . (Из ссылки)

  string[] rolesArray;

  public void Page_Load()
  {
       RolePrincipal r = (RolePrincipal)User;
       rolesArray = r.GetRoles();
       ...//extra code
  }
14 голосов
/ 10 января 2013

Простое членство в MVC4:

Получение роли пользователя-

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

Чтобы проверить, принадлежит ли пользователь определенной роли-

if (User.IsInRole("External"))
13 голосов
/ 09 августа 2011

Вы можете получить роль текущего пользователя с помощью Roles.GetRolesForUser().

Чтобы проверить, принадлежит ли пользователь роли, вот что я сделал:

Roles.GetRolesForUser().Contains("Administrator")
3 голосов
/ 05 декабря 2015

Я не знаю, пропускаю ли я какие-то странные настройки или настройки, но я не могу получить, например, User.IsInRole или Roles.GetRolesForUser() на работу. Я просто получаю исключение (я думаю, нулевая ссылка), и приложение просто останавливается. Несмотря на то, что я настроил RoleManager для OwinContext, метод Create и т. Д., Например, в проекте Identity Sample, а также включил Role Manager в 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();

Это, возможно, не самый оптимизированный способ и может быть изменен на более простую форму, но это сработало для меня и, возможно, не требует столько настроек / зависимостей, как другие подходы. Второй подход заключается в следующем (добавьте это в ваш класс контроллера):

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

Внутри вашего контроллера вы можете теперь сделать, например ::10000

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

Я использую приложение ASP.NET MVC 5 только для ясности. RoleManager в этом примере не используется, но его можно использовать для создания, поиска, обновления и т. Д. Ролей. Использование этого подхода позволяет выполнять асинхронные вызовы с использованием await, если это полезно для вашего приложения.

0 голосов
/ 31 января 2018

Я использую этот код

 ((ClaimsIdentity)User.Identity).FindAll(ClaimTypes.Role).ToList()
 .OrderBy(x => x.Value == "admin" ? 1
 : x.Value == "Salesperson" ? 2 
 : x.Value == "User" ? 3 : 4).First().Value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...