Работа с ролями в AspNet Identity

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

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

Кроме логинов и паролей система авторизации и аутентификации предлагает еще такой компонент для разграничения доступа, как роли. Роли позволяют создать группы пользователей с определенными правами и в зависимости от принадлежности к той или иной группе, разграничить доступ к ресурсам приложения. Посмотрим на примере.

Возьмем стандартный проект 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");
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850