Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
В данном случае мы продолжим работу с проектом, созданным в предыдущем разделе.
Чтобы переопределить провайдер ролей. нам надо создать класс, производный от 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 "Ваша роль: Администратор"; } } }
Для тестирования можно зарегистрировать пару пользователь с разными ролями и попробовать получить доступ к действиям контроллера.