Авторизация в MVC 4 и SimpleMembershipProvider

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

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

В 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 набор таблиц, если они еще не существуют.

При первом обращении к БД, если ее не существовало, она будет создана и автоматически заполнена таблицами с определенными полями.

Таблицы в БД по умолчанию в ASP.NET MVC 4

Эти таблицы имеют следующее определение:

webpages_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 используется для управления учетными записями пользователей, то есть членством.

webpages_OAuthMembership

Столбец

Тип данных

Provider

nvarchar(30)

ProviderUserId

nvarchar(100)

UserId

int

webpages_Roles

Столбец

Тип данных

RoleId

int

RoleName

nvarchar(256)

webpages_UsersInRoles

Столбец

Тип данных

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 для управления данными.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850