Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
В ASP.NET MVC 4 был введен новый провайдер членства, который стал использоваться по умолчанию в проектах по типу Internet Application
- SimpleMembershipProvider. Класс SimpleMembershipProvider призван упростить работу с пользователями и ролями, обладая большей гибкостью и расширяемостью по сравнению
с традиционным провайдером членства. Представляемое этим классом API по сути применяет те же провайдеры,
которые содержатся в основе ASP.NET API. Так, класс SimpleRoleProvider просто применяет абстрактный базовый класс RoleProvider
.
Класс SimpleMembershipProvider также применяет традиционный провайдер членства: сначала абстрактный класс ExtendedMembershipProvider наследует MembershipProvider, а затем сам SimpleMembershipProvider наследуется от ExtendedMembershipProvider.
Для облегчения работы с новым провайдером членства используется класс-хелпер WebSecurity из пространства имен
WebMatrix.WebData
. Через этот класс мы можем инициализировать подключение или проводить верифицикацию пользователей.
В качестве примера для рассмотрения выберем проект по типу Internet Application. После создания проекта в каталоге Filters в структуре проекта мы можем найти файл InitializeSimpleMembershipAttribute.cs, который содержит объявление класса InitializeSimpleMembershipAttribute. Этот класс является производным от ActionFilterAttribute, то есть фактически представляет класс фильтра действия, применяемого к контроллеру AccountController.
InitializeSimpleMembershipAttribute содержит определение класса-инициализатора SimpleMembershipProvider, который создает соединение с базой данных следующим вызовом:
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
По умолчанию этот метод определяет следующие значения:
"DefaultConnection" - имя подключение, которое содержится в файле Web.config
"UserProfile" - название таблицы пользователей в БД (по умолчанию содержит столбцы UserId и UserName). Именно эта таблица хранит профили пользователей.
"UserId" - имя столбца в таблице пользователей, который содержит Id пользователя
"UserName" - имя столбца в таблице пользователей, который содержит имя пользователя
autoCreateTables: true - создает весь необходимый для провайдера Simple Membership набор таблиц, если они еще не существуют.
При первом обращении к БД, если ее не существовало, она будет создана и автоматически заполнена таблицами с определенными полями.
Эти таблицы имеют следующее определение:
Столбец | Тип данных |
UserId | int |
CreateDate | datetime |
ConfirmationToken | nvarchar(128) |
IsConfirmed | bit |
LastPasswordFailureDate | datetime |
PasswordFailuresSinceLastSuccess | int |
Password | nvarchar(128) |
PasswordChangedDate | datetime |
PasswordSalt | nvarchar(128) |
PasswordVerificationToken | nvarchar(128) |
PasswordVerificationTokenExpirationDate | datetime |
Таблица webpages_Membership используется для управления учетными записями пользователей, то есть членством.
Столбец | Тип данных |
Provider | nvarchar(30) |
ProviderUserId | nvarchar(100) |
UserId | int |
Столбец | Тип данных |
RoleId | int |
RoleName | nvarchar(256) |
Столбец | Тип данных |
UserId | int |
RoleId | int |
Последние две таблицы используются для управления ролями и пользователей.
Почему создаются таблицы именно с этими именами? Эти имена определены в коде самого SimpleMembershipProvider
:
//.................................. internal static string MembershipTableName { get { return "webpages_Membership"; } } internal static string OAuthMembershipTableName { get { return "webpages_OAuthMembership"; } } //........................
Другие две таблицы закодированы в коде SimpleRoleProvider
:
internal static string RoleTableName { get { return "webpages_Roles"; } } internal static string UsersInRoleTableName { get { return "webpages_UsersInRoles"; } }
Чтобы сменить способ организации данных в таблицах нам придется создать собственные провайдеры членства и ролей.
Однако таблицу определения пользователей, которая по умолчанию называется UserProfile, мы вполне можем переопределить. В следующем разделе мы это попробуем сделать.
По умолчанию регистрация пользователя в методе Register контроллера AccountController проводится с помощью следующего кода:
WebSecurity.CreateUserAndAccount(model.UserName, model.Password)
. Передавая в метод введенные данные, мы создаем две записи
- одну запись в таблице пользователей UserProfiles, где создается запись о пользователе, и связанная с ней запись в таблице членства
webpages_Membership, где хранится пароль и другие учетные данные пользователя.
SimpleMembershipProvider использует для шифрования пароля алгоритм PBKDF2, после шифрования зашифрованный пароль попадает в таблицу
webpages_Membership в соответствующее поле.
Затем уже по логину и паролю мы можем войти на сайт - за это отвечает строка WebSecurity.Login(model.UserName, model.Password)
в методе Login контроллера AccountController. Здесь проверяются на валидность введенный логин и пароль, и если они проходит проверку,
то пользователь аутентифицируется.
SimpleMembershipProvider, будучи довольно гибким классом, может работать с различными типами SQL Server: SQL Server, SQL Azure, SQL Server CE, SQL Server Express, LocalDB. В тоже время он имеет ограничения: так он не может работать с СУБД MySQL, базами данных NoSQL, поскольку использует специфичные для MS SQL Serverа выражения SQL для управления данными.