Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
ASP.NET MVC предоставляет нам законченную модель провайдеров членства/ролей (в виде универсальных провайдеров или в виде SimpleMembershipPrivider API), которые предлагают нам некоторую стандартную инфраструктуру с уже определенными таблицами. Однако иногда стандартные механизмы членства могут не удовлетворять наши потребности. Например, некоторым модель членства кажется довольно тяжеловесной. А кто-то хотел бы применить свою схему таблиц и авторизации. Поэтому в данном случае нам поможет переопределение стандартных механизмов членства и ролей.
Переопределение членства предполагает, что мы должны переопределить методы абстрактного класса MembershipProvider, который лежит в основе провайдеров членства. А переопределение провайдера ролей включает реализацию абстрактного класса RoleProvider. Посмотрим на пример. Создадим новый проект ASP.NET MVC 4 по шаблону Basic. Назовем его, например, CustomAuthorization.
Первым делом определим модели, которые будут описывать учетные записи. Это у нас будут модели пользователей и ролей, а также контекст данных для доступа к ним. Итак, добавим в папку Models следующие классы:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.ComponentModel.DataAnnotations; using System.Data.Entity; namespace CustomAuthorization.Models { public class UserContext : DbContext { public DbSet<User> Users { get; set; } public DbSet<Role> Roles { get; set; } } public class User { public int Id { get; set; } public string Email { get; set; } public string Password { get; set; } public DateTime CreationDate { get; set; } public int? RoleId { get; set; } public Role Role { get; set; } } public class Role { public int Id { get; set; } public string Name { get; set; } } }
Во-первых, здесь определен класс пользователя, который будет иметь следующие поля: id, адрес электронной почты, дату регистрации, пароль и ссылку на выполняемую роль в системе. Предполагается, что пользователи в качестве логина на сайте будут использовать адрес электронной почты.
Во-вторых, у нас имеется класс роли в системе, а также контекст UserContext, через который мы будем получать данные из БД.
В отличие от провайдеров членства, рассмотренных в прошлых разделах, здесь мы сами создадим базу данных, структуру которой мы определим сами. Эта структура будет полностью соответствовать вышеописанным моделям.
Итак, создадим новую базу данных для нашего приложения, поместив ее в папку App_Data. Назовем ее, например, StoreDB.
Создадим таблицу Roles, которая будет хранить роли пользователей:
Создадим таблицу Users, которая будет хранить пользователей:
Итак, столбцы в таблицах в точности соответствуют определению моделей, а в качестве ссылки на роль в таблице Roles в таблице Users используется внешний ключ. Это и все в плане хранения данных, что нам потребуется для аутентификации и авторизации пользователей.
Добавим в таблицу Roles пару ролей (пусть это будут роли администратора и простого пользователя):
И в файле web.config добавим определение строки подключения:
<connectionStrings> <add name="UserContext" connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename='|DataDirectory|\StoreDB.mdf';Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings>
Теперь в следующей теме создадим свой провайдер членства.