Переопределение провайдера ролей

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 31.10.2015

В данном случае мы продолжим работу с проектом, созданным в предыдущем разделе.

Чтобы переопределить провайдер ролей. нам надо создать класс, производный от RoleProvider. Поэтому добавим в папку Providers новый класс (назовем его CustomRoleProvider) со следующим содержанием:

using System;
using System.Linq;
using System.Web.Security;
using System.Data.Entity;
using CustomAuthorization.Models;

namespace CustomAuthorization.Providers
{
    public class CustomRoleProvider : RoleProvider
    {
        public override string[] GetRolesForUser(string username)
        {
            string[] roles = new string[] { };
            using (UserContext db = new UserContext())
            {
                // Получаем пользователя
                User user = db.Users.Include(u=>u.Role).FirstOrDefault(u => u.Email == username);
                if (user != null && user.Role!=null)
                {
                    // получаем роль
                    roles = new string[] { user.Role.Name };
                }
                return roles;
            }
        }
        public override void CreateRole(string roleName)
        {
            throw new NotImplementedException();
        }
        public override bool IsUserInRole(string username, string roleName)
        {
            using (UserContext db = new UserContext())
            {
                // Получаем пользователя
                User user = db.Users.Include(u=>u.Role).FirstOrDefault(u => u.Email == username);

                if (user!=null && user.Role!=null && user.Role.Name == roleName)
                    return true;
                else
                    return false;
            }
        }
        public override void AddUsersToRoles(string[] usernames, string[] roleNames)
        {
            throw new NotImplementedException();
        }

        public override string ApplicationName
        {
            get { throw new NotImplementedException(); }
            set { throw new NotImplementedException(); }
        }

        public override bool DeleteRole(string roleName, bool throwOnPopulatedRole)
        {
            throw new NotImplementedException();
        }

        public override string[] FindUsersInRole(string roleName, string usernameToMatch)
        {
            throw new NotImplementedException();
        }

        public override string[] GetAllRoles()
        {
            throw new NotImplementedException();
        }

        public override string[] GetUsersInRole(string roleName)
        {
            throw new NotImplementedException();
        }

        public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames)
        {
            throw new NotImplementedException();
        }

        public override bool RoleExists(string roleName)
        {
            throw new NotImplementedException();
        }
    }
}

Здесь в целях демонстрации переопределено три метода. Первый из них - GetRolesForUser позволяет получать набор ролей для определенного пользователя.

Второй метод - CreateRole - предполагает создание роли.

И третий переопределенный метод - IsUserInRole - указывает, выполняет ли пользователь определенную роль в системе.

В принципе здесь опять, как и в случае с провайдером членства, идет стандартная работа с моделями Role и User через контекст данных UserContext, и ничего очень сложного не должно быть.

Теперь используем провайдер ролей в приложении. Сначала добавим в файл web.config определение провайдера ролей рядом с определением провайдера членства (либо в другом месте в пределах узла system.web:

	<roleManager enabled="true" defaultProvider="MyRoleProvider">
      <providers>
        <clear/>
        <add name="MyRoleProvider" type="CustomAuthorization.Providers.CustomRoleProvider" />
      </providers>
    </roleManager>

Теперь мы можем использовать наш провайдер ролей как и любой другой. Например, определим в каком-нибудь контроллере разный доступ к его ресурсам в зависимости от роли:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace CustomAuthorization.Controllers
{
    [Authorize]
    public class HomeController : Controller
    {
        public string Index()
        {
            return "Ваш логин: " + HttpContext.User.Identity.Name;
        }
        [Authorize(Roles="admin")]
        public string ViewRole()
        {
            return "Ваша роль: Администратор";
        }
    }
}

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

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850