Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Кроме логинов и паролей система авторизации и аутентификации предлагает еще такой компонент для разграничения доступа, как роли. Роли позволяют создать группы пользователей с определенными правами и в зависимости от принадлежности к той или иной группе, разграничить доступ к ресурсам приложения. Посмотрим на примере.
Возьмем стандартный проект ASP.NET MVC 5 с моделью аутентификации Individual User Accounts. По умолчанию система AspNet Identity включает все необходимые средства для управления ролями. В начале главы мы уже разбирались с механизмом AspNet Identity. В стандартном проекте MVC 5 каждая роль представлена объектом класса IdentityRole, который реализует интерфейс IRole. По аналогии с управлением пользователями и классом UserManager для управления ролями предназначен класс RoleManager, который использует в качестве хранилища ролей объект RoleStore.
Задействуем систему ролей в проекте. Например, нам надо, чтобы у нас в базе данных уже был один пользователь, выполняющий роль админа. Итак, проинициализируем базу данных начальными значениями для ролей и пользователей. Для этого добавим в папку Models новый класс
using Microsoft.AspNet.Identity; using Microsoft.AspNet.Identity.EntityFramework; using System.Data.Entity; namespace RolesIdentityApp.Models { public class AppDbInitializer : DropCreateDatabaseAlways<ApplicationDbContext> { protected override void Seed(ApplicationDbContext context) { var userManager = new ApplicationUserManager(new UserStore<ApplicationUser>(context)); var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context)); // создаем две роли var role1 = new IdentityRole { Name = "admin" }; var role2 = new IdentityRole { Name = "user" }; // добавляем роли в бд roleManager.Create(role1); roleManager.Create(role2); // создаем пользователей var admin = new ApplicationUser { Email = "somemail@mail.ru", UserName = "somemail@mail.ru" }; string password = "ad46D_ewr3"; var result = userManager.Create(admin, password); // если создание пользователя прошло успешно if(result.Succeeded) { // добавляем для пользователя роль userManager.AddToRole(admin.Id, role1.Name); userManager.AddToRole(admin.Id, role2.Name); } base.Seed(context); } } }
Так как у нас по умолчанию уже определен в проекте контекст данных для управления пользователями и ролями ApplicationDbContext, то мы его указываем при создании объектов UserManager и RoleManager.
Метод roleManager.Create
позволяет добавить роль в бд в таблицу AspNetRoles, а метод userManager.AddToRole
устанавливает
определенную роль для пользователя с переданным в метод id.
Обратите внимание, что мы можем добавить для одного пользователя множество ролей, как в данном случае
Ну и чтобы инициализация базы данных заработала, добавим ее вызов в файл Global.asax в метод App_Start:
protected void Application_Start() { Database.SetInitializer<ApplicationDbContext>(new AppDbInitializer()); AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); }
Теперь при запуске приложения в базе данных окажется один пользователь и две роли. И теперь мы можем устанавливать разграничение доступа по ролям на уровне контроллеров и методов:
public class HomeController : Controller { [Authorize(Roles="admin")] public ActionResult About() { ViewBag.Message = "Your application description page."; return View(); } }
Теперь к методу About могут обратиться только администраторы. Но пойдем дальше. У нас есть еще одна роль, и мы, например, хотим, чтобы при регистрации всем пользователям присваивалась роль "user". Для этого изменим метод Register следующим образом:
[HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task<ActionResult> Register(RegisterViewModel model) { if (ModelState.IsValid) { var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; var result = await UserManager.CreateAsync(user, model.Password); if (result.Succeeded) { // если создание прошло успешно, то добавляем роль пользователя await UserManager.AddToRoleAsync(user.Id, "user"); await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false); return RedirectToAction("Index", "Home"); } AddErrors(result); } return View(model); }
Теперь выведем на веб-страницу все роли текущего пользователя:
[Authorize] public ActionResult Index() { IList<string> roles= new List<string>{"Роль не определена"}; ApplicationUserManager userManager = HttpContext.GetOwinContext() .GetUserManager<ApplicationUserManager>(); ApplicationUser user = userManager.FindByEmail(User.Identity.Name); if (user != null) roles = userManager.GetRoles(user.Id); return View(roles); }
С помощью метода GetRoles()
класса UserManager мы можем получить набор ролей определенного пользователя.
Для удаления роли у пользователя используется метод RemoveFromRole()
, который также определен у класса UserManager. Например, удалим
у текущего пользователя роль "user":
userManager.RemoveFromRole(user.Id, "user");