Подтвердить что ты не робот

Получить текущую роль пользователя

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

4b9b3361

Ответ 1

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

  string[] rolesArray;

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

Ответ 2

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

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

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

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

Ответ 3

Простое участие в MVC4:

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

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

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

if (User.IsInRole("External"))

Ответ 4

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

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

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

Ответ 5

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

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

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

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

Ответ 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.

эта роль будет IList

если логика вашего приложения такова, что пользователь может играть только одну роль, вы можете получить к нему доступ с помощью

string roleName = role[0];