Как я могу проверить, находится ли пользователь в одной из нескольких разных ролей с помощью простого членства MVC4?
Я понимаю, что хороший способ проверить, является ли пользователь в роли:
if (User.IsInRole("Admin"))
{
}
Как я могу проверить, находится ли мой пользователь в одной из ролей "Автор", "Админ" или "Супер"? Есть ли способ сделать это без кодирования "User.IsInRole" для каждой из ролей?
Ответы
Ответ 1
EDIT: без кодирования каждой роли, сделайте это методом расширения LINQ, например:
private static bool IsInAnyRole(this IPrincipal user, List<string> roles)
{
var userRoles = Roles.GetRolesForUser(user.Identity.Name);
return userRoles.Any(u => roles.Contains(u));
}
Для использования выполните следующие действия:
var roles = new List<string> { "Admin", "Author", "Super" };
if (user.IsInAnyRole(roles))
{
//do something
}
Или без метода расширения:
var roles = new List<string> { "Admin", "Author", "Super" };
var userRoles = Roles.GetRolesForUser(User.Identity.Name);
if (userRoles.Any(u => roles.Contains(u))
{
//do something
}
Ответ 2
Нет встроенного способа проверить, есть ли у пользователя несколько ролей, но довольно тривиально создать хороший метод расширения для его обработки:
public static bool IsInAnyRole(this IPrincipal principal, params string[] roles)
{
return roles.Any(principal.IsInRole);
}
Используется тогда:
if (User.IsInAnyRole("Admin", "Author", "SuperUser"))
{
}
Ответ 3
Я хотел немного уточнить ответ на mattytommo, вот что я использую:
Метод расширения:
public static bool IsInAnyRole(this IPrincipal user, string[] roles)
{
//Check if authenticated first (optional)
if (!user.Identity.IsAuthenticated) return false;
var userRoles = Roles.GetRolesForUser(user.Identity.Name);
return userRoles.Any(roles.Contains);
}
Константы:
public static class Role
{
public const string Administrator = "Administrator";
public const string Moderator = "Moderator";
}
Применение:
if (User.IsInAnyRole(new [] {Role.Administrator,Role.Moderator}))
{
//Do stuff
}
Ответ 4
Вы также можете использовать
if(Roles.GetRolesForUser(model.UserName).Contains("Admin")){
}
Ответ 5
Я использовал приведенный ниже код. В моем случае у меня была строка с ограниченным ограничением в виде двоеточия в качестве параметра, который считывается из web.config. Вы можете легко изменить приведенный ниже код, если вы передаете список.
public class ActiveDirectoryGroup
{
public static bool IsInAnyRole(string adRoles)
{
return adRoles.Split(Convert.ToChar(";")).Any(role => !string.IsNullOrEmpty(role.Trim()) && HttpContext.Current.User.IsInRole(role.Trim()));
//If list is passed use below
//return listParameter.Any(role => !string.IsNullOrEmpty(role.Trim()) && HttpContext.Current.User.IsInRole(role.Trim()));
}
}
В web.config:
<appSettings>
<add key="ADGroup" value="Domain\Admin;Domain\Supervisor;Domain\Manager;" />
</appSettings>
Я использовал его, как показано ниже, в моей загрузке страницы:
if (ActiveDirectoryGroup.IsInAnyRole(ConfigurationManager.AppSettings["ADGroup"]))
{
//do something
}
Ответ 6
Пожалуйста, используйте этот простой способ:
@using Microsoft.AspNet.Identity
@if (Request.IsAuthenticated)
{
if (User.IsInRole("Administrator") || User.IsInRole("Moderator"))
{
... Your code here
}
}
Ответ 7
В моем случае у меня есть только одна роль для каждого пользователя. Поэтому я сделал это следующим образом:
if (User.Roles.FirstOrDefault().RoleId == "7b433246-5881-4ace-bbaa-e5514191171c") {
//Do something
}