Содержание
Шаблон Identity — это наиболее простой способ подключения системы аутентификации пользователей в свой проект. При изучении «чистого» ASP.NET Core мы изучали вопросы аутентификации и авторизации пользователей практически с нуля, разрабатывая свою систему аутентификации. ASP.NET Core MVC, если можно так выразится, фреймворк более высокого уровня. То есть, опираясь на «чистый» ASP.NET Core, здесь для нас уже подготовлена основная инфраструктура проекта, сделана удобная система маршрутизации, есть готовые tag-хэлперы т.д. Что касается системы аутентификации пользователей, то шаблон Identity можно рассматривать как отдельную библиотеку Razor для управления аутентификацией пользователей.
Варианты аутентификации пользователей в ASP.NET Core MVC
При создании нового проекта ASP.NET Core MVC мы можем выбрать мы можем выбрать следующие варианты аутентификации пользователей:
- Индивидуальные учётные записи — система ASP.NET Core Identity, позволяющая аутентифицировать пользователей, как внутри приложения, так и с помощью внешних сервисов, например Google.
- Платформа удостоверений Microsoft — для аутентификации пользователей используется облачная служба удостоверений от Microsoft, включающая в себя средства аутентификации OAuth 2.0 и OpenID Connect, библиотеки для приложений и т.д.
- Windows — для аутентификации используются учётные записи Windows. Подойдет для приложений, работающих во внутренней сети компании.
Далее мы будем использовать индивидуальные учётные записи. И вначале посмотрим как выглядит проект в котором по умолчанию включена проверка подлинности.
Проект ASP.NET Core MVC с проверкой подлинности
Итак, создаем новый проект ASP.NET Core MVC и выбираем в настройках «Тип проверки подлинности» — «Индивидуальные учётные записи»
В принципе, этого будет уже достаточно, чтобы создать проект, поддерживающий аутентификацию пользователей с использованием ASP.NET Core Identity и, использующий шаблонные представления такие как страницы входа/регистрации пользователей, восстановление пароля и т.д. Но, перед этим нам необходимо создать базу данных для хранения учётных записей пользователей. По умолчанию для нас уже создана миграция с начальной настройкой БД:
Перейдем в консоль диспетчера пакетов Nuget и выполним команду Update-Database
:
Теперь запустим проект и посмотрим на его внешний вид. Первым на себя обращает внимание частичное представление в котором содержатся ссылки на регистрацию и вход пользователя: Станица регистрации нового пользователя
Можно задать какие-нибудь данные для регистрации, и после этого войти в систему. Сейчас шаблон Identity содержит различные заглушки, типа проверки email пользователя, поэтому подойдут любые регистрационные данные. После входа в систему логин пользователя появится справа вверху:
Нажав на логин можно просмотреть настройки аккаунта:
Можно поиграться с шаблоном Identity, посмотреть какие ещё шаблонные элементы присутствуют в проекте, как они работают и т.д. Мы же разберемся с тем, где хранятся все эти данные и представления, которые мы видим в приложении.
Где хранятся данные ASP.NET Core Identity
По умолчанию, ASP.NET Core Identity хранит данные пользователей в БД SQL Server настройки подключения к которой можно найти в файле appsettings.json:
"ConnectionStrings": { "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=[имя_бд];Trusted_Connection=True;MultipleActiveResultSets=true" }
Контекст базы данных в новом приложении выглядит следующим образом:
public class ApplicationDbContext : IdentityDbContext { public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } }
Здесь IdentityDbContext
— это базовый класс для контекста базы данных Entity Framework, используемого для Identity. Этот класс содержит основные свойства, необходимые для работы с ASp.NET Core Identity. Так, когда мы выполнили обновление базы данных, то на основании свойств IdentityDbContext
были созданы следующие таблицы:
Чтобы увидеть эти таблицы, необходимо открыть обозреватель объектов SQL Server и выбрать базу данных, указанную в настройках соединения в файле appsettings.json. По умолчанию, при регистрации первого пользователя создаются следующие таблицы:
По умолчанию при регистрации первого пользователя создается следующий набор таблиц:
_EFMigrationsHistory
— используется Entity Framework Core для миграций БДAspNetRoles
— содержит определения ролейAspNetUserClaims
— таблица, хранящая набор утверждений для пользователей (Claim
). Эти утверждения помогают идентифицировать пользователя. Например, в качестве claim может выступать email пользователя, его Id, какие-то кастомные данные (например, отдел в котором работает пользователь) и т.д.AspNetUserLogins
— таблица логинов пользователя, если используются внешние поставщики, например, GoogleAspNetUserRoles
— таблица, устанавливающая для пользователей определенные ролиAspNetUsers
— собственно таблица пользователей. Если мы ее откроем, то увидим данные зарегистрированного пользователяAspNetUserTokens
— токены пользователя, полученные от внешних поставщиков
Следующий момент — откуда берутся все эти представления, которые мы видим, когда регистрируемся, управляем аккаунтом и т.д.? Если посмотреть на состав проекта, то можно увидеть, что область Identity, в которой, по идее должны находится представления для аутентификации, пустая:
Все эти представления мы получаем из библиотеки Microsoft.
При этом, при желании, мы можем переопределить любой элемент на своё усмотрение. В этом случае, в проекте будет использоваться наш шаблон того или иного представления.
Как переопределить шаблоны ASP.NET Core Identity в проекте MVC?
Чтобы переопределить стандартный шаблон Identity мы должны выбрать в контекстном меню проекта пункт Добавить — Создать шаблонный элемент:
В открывшемся окне выбрать пункт «Удостоверение» и нахать «Добавить»:
После этого Visual Studio сформирует необходимые шаблоны и предложит выбрать те элементы, которые мы хотим переопределить:
Здесь же мы можем указать свой контекст базы данных, который будет использоваться для хранения данных о пользователях и класс (модель) пользователя. Например, переопределим представление, отвечающее за регистрацию пользователя:
Так как у нас уже имеется в проекте контекст базы данных для пользователей, то пока нет смысла создавать новый, поэтому я указал в поле «Класс DbContext» его. После нажатия кнопки «Добавить» Visual Studio создаст необходимые шаблоны с которыми мы уже можем работать:
В файле _ValidationScriptsPartial.cshtml, в зависимости от названия среды окружения, подключаются и настраиваются скрипты для валидации модели пользователя:
<environment include="Development"> <script src="~/Identity/lib/jquery-validation/dist/jquery.validate.js"></script> <script src="~/Identity/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"></script> </environment> <environment exclude="Development"> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.17.0/jquery.validate.min.js" asp-fallback-src="~/Identity/lib/jquery-validation/dist/jquery.validate.min.js" asp-fallback-test="window.jQuery && window.jQuery.validator" crossorigin="anonymous" integrity="sha384-rZfj/ogBloos6wzLGpPkkOr/gpkBNLZ6b6yLy4o+ok+t/SAKlL5mvXLr0OXNi1Hp"> </script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validation-unobtrusive/3.2.11/jquery.validate.unobtrusive.min.js" asp-fallback-src="~/Identity/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js" asp-fallback-test="window.jQuery && window.jQuery.validator && window.jQuery.validator.unobtrusive" crossorigin="anonymous" integrity="sha384-R3vNCHsZ+A2Lo3d5A6XNP7fdQkeswQWTIPfiYwSpEP3YV079R+93YzTeZRah7f/F"> </script> </environment>
а в файле _ViewImports.cshtml, как обычно, подключаются необходимые пространства имен и tag-хэлперы для работы с представлениями:
@using Microsoft.AspNetCore.Identity @using AspMvcAuthEmpty2.Areas.Identity @using AspMvcAuthEmpty2.Areas.Identity.Pages @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
Файл Register.cshtml, собственно, и содержит представление, используемое, когда мы жмем кнопку «Register», а также класс модели для регистрации пользователя:
Можем внести в файл представления какие-нибудь изменения, например, «руссифицировать» заголовок:
и увидеть изменения в проекте:
Итого
В этой части мы познакомились с шаблоном Identity для проекта ASP.NET Core MVC, узнали где хранятся по умолчанию данные пользователей и представления для Identity. На данный момент система аутентификации пользователей в ASP.NET Core MVC для нас выглядит как некий «черный ящик» в котором происходит какая-то «магия». В следующих частях мы разберемся с системой аутентификации более детально.