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

Простые пользовательские роли для проверки подлинности Windows в asp. сеть?

В нашей сети, роли в Active Directory (AD) не назначаются для моего приложения. Поэтому я создал простую таблицу в моей базе данных, отображающую всех пользователей в AD и их ролях. В этой таблице буквально всего два столбца, пользователь и роль.

Я надеюсь воспользоваться мощным управлением ролью в asp.net, я хочу использовать такие функции, как [Authorize(Roles = "Managers")]. есть ли простой способ использовать эти пользовательские роли, не устанавливая сложную роль и членский провайдер?

: sql server, linq, asp.net mvc

4b9b3361

Ответ 2

Статья предоставлена в случае, если сайт не работает.

Пользовательский поставщик ролей для MVC

В предыдущей статье я объяснил, как создать пользовательский поставщик членства, чтобы авторизовать пользователя и защитить элементы управления и страницы. Но что, если вы хотите показать или защитить какую-то область, контроллер или страницу для определенной группы пользователей? Например, разрешить доступ к панели администратора только для администраторов.

В .Net Framework для этого есть Role Provider. Но опять же, он использует собственную БД для хранения пользовательских ролей. Итак, давайте создадим и настроим Custom Role Provider, который будет использовать нашу БД или любое другое хранилище. Как и прежде, мы должны переписать класс из .NET:

enter image description here

enter image description here

enter image description here

Для минимальной функциональности нам нужно реализовать и перезаписать две функции 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();
        }

    }
}

Ответ 3

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

Пользовательский поставщик ролей с перечислением

Статья называется "Поставщики пользовательских ролей ASP.NET MVC 5 для аутентификации Windows".