Ответ 1
Очень просто реализовать поставщика настраиваемых ролей. В основном вам нужно реализовать две функции.
Посмотрите на статью: Пользовательский поставщик роли для MVC
В нашей сети, роли в Active Directory (AD) не назначаются для моего приложения. Поэтому я создал простую таблицу в моей базе данных, отображающую всех пользователей в AD и их ролях. В этой таблице буквально всего два столбца, пользователь и роль.
Я надеюсь воспользоваться мощным управлением ролью в asp.net, я хочу использовать такие функции, как [Authorize(Roles = "Managers")]
. есть ли простой способ использовать эти пользовательские роли, не устанавливая сложную роль и членский провайдер?
: sql server, linq, asp.net mvc
Очень просто реализовать поставщика настраиваемых ролей. В основном вам нужно реализовать две функции.
Посмотрите на статью: Пользовательский поставщик роли для MVC
Статья предоставлена в случае, если сайт не работает.
Пользовательский поставщик ролей для MVC
В предыдущей статье я объяснил, как создать пользовательский поставщик членства, чтобы авторизовать пользователя и защитить элементы управления и страницы. Но что, если вы хотите показать или защитить какую-то область, контроллер или страницу для определенной группы пользователей? Например, разрешить доступ к панели администратора только для администраторов.
В .Net Framework для этого есть Role Provider. Но опять же, он использует собственную БД для хранения пользовательских ролей. Итак, давайте создадим и настроим Custom Role Provider, который будет использовать нашу БД или любое другое хранилище. Как и прежде, мы должны переписать класс из .NET:
Для минимальной функциональности нам нужно реализовать и перезаписать две функции GetRolesForUser и IsUserInRole. Во-первых, один используется для получения списка всех пользовательских ролей (или групп):
public override string[] GetRolesForUser(string username)
{
using (DatabaseEntities db = new DatabaseEntities())
{
User user = db.Users.FirstOrDefault(u => u.UserName.Equals(username, StringComparison.CurrentCultureIgnoreCase) || u.Email.Equals(username, StringComparison.CurrentCultureIgnoreCase));
var roles = from ur in user.UserRoles
from r in db.Roles
where ur.RoleId == r.Id
select r.Name;
if (roles != null)
return roles.ToArray();
else
return new string[] {}; ;
}
}
Как вы можете видеть, я нахожу пользователя в своей БД по параметру username функции (в моем случае это может быть имя пользователя или адрес электронной почты) и создаю строковый список ролей пользователя.
Вторая функция - проверить, есть ли пользователь в роли (или группе):
public override bool IsUserInRole(string username, string roleName)
{
using (DatabaseEntities db = new DatabaseEntities())
{
User user = db.Users.FirstOrDefault(u => u.UserName.Equals(username, StringComparison.CurrentCultureIgnoreCase) || u.Email.Equals(username, StringComparison.CurrentCultureIgnoreCase));
var roles = from ur in user.UserRoles
from r in db.Roles
where ur.RoleId == r.Id
select r.Name;
if (user != null)
return roles.Any(r => r.Equals(roleName, StringComparison.CurrentCultureIgnoreCase));
else
return false;
}
}
Затем нам нужно настроить в файле web.config решение для использования созданного поставщика ролей. Может потребоваться установить для cacheRolesInCookie
значение false для целей отладки, иначе поведение будет непредсказуемым.
<system.web>
<compilation debug="true" targetFramework="4.5.2" />
<httpRuntime targetFramework="4.5.2" />
<authentication mode="Windows" />
<authorization>
<deny users="?" />
</authorization>
<roleManager cacheRolesInCookie="true" defaultProvider="KitsulaRoleProvider" enabled="true">
<providers>
<clear />
<add name="KitsulaRoleProvider" type="Kitsula.Security.KitsulaRoleProvider" />
</providers>
</roleManager>
</system.web>
Теперь вы можете защитить контроллеры, действия, страницы для определенной группы пользователей, которые находятся в указанных ролях, с помощью установленного атрибута Authorize:
using System;
using System.Web.Mvc;
namespace Kitsula.Areas.Admin.Controllers
{
[Authorize(Roles = "Administrators")]
public class HomeController : Controller
{
//
// GET: /Admin/Home/
public ActionResult Index()
{
return View();
}
}
}
Ссылка ниже показывает другое решение для настраиваемого поставщика ролей, которое использует значения перечисления:
Пользовательский поставщик ролей с перечислением
Статья называется "Поставщики пользовательских ролей ASP.NET MVC 5 для аутентификации Windows".