Identity Шаблон в проектах ASP.NET Core

Автор: Рик Андерсон (Rick Anderson)

В этой статье показано, как перенести базу данных и выполнить обновление Identity скэффолдинга.

Blazor Identity строительные леса

Шаблоны ASP.NET Core Identity добавляют ASP.NET Core Identity в приложения Blazor Web App и Blazor Server. После того как scaffolder добавит в приложение компоненты IdentityRazor, вы можете настроить их под требования вашего приложения.

Хотя генератор создает необходимый код C# для добавления Identity в приложение, для завершения процесса необходимо обновить базу данных проекта с помощью миграции базы данных в Entity Framework Core. В этой статье описаны действия по миграции базы данных.

После запуска шаблонов Identity проверьте изменения. Используйте GitHub или другую систему управления версиями, которая отображает изменения файлов с функцией возврата изменений.

Службы требуются при использовании двухфакторной проверки подлинности (2FA), подтверждения учетной записи и восстановления паролей и других функций безопасности.Identity Службы или заглушки служб не создаются при создании шаблонов Identity. Службы для включения этих функций необходимо добавить вручную.

RazorСтраницы и шаблон MVC Identity

ASP.NET Core предоставляет ASP.NET Core Identity в Razor качестве библиотеки классов (RCL). Приложения, которые включают в себя Identity , могут применять шаблон для выборочного добавления исходного кода, содержащегося в Identity RCL. Вы можете создать исходный код, чтобы изменить код и тем самым изменить поведение. Например, вы можете указать генератору шаблонов сгенерировать код, используемый при регистрации. Identity Настраиваемый код переопределяет реализацию по умолчанию, предоставляемую Identity RCL. Чтобы получить полный контроль над пользовательским интерфейсом и не использовать RCL по умолчанию, см. раздел «Создание полного исходного кода Identity пользовательского интерфейса».

Приложения, которые не включают проверку подлинности, могут применять шаблон для добавления пакета RCL Identity . Вы можете выбрать, какой Identity код сгенерировать.

Хотя шаблон создает большую часть необходимого кода, необходимо обновить проект, чтобы завершить процесс. В этой статье описаны шаги, необходимые для выполнения обновления Identity шаблонов. После запуска генератора Identity проверьте изменения. Используйте систему управления версиями, которая показывает различия между файлами и позволяет отменять изменения.

Службы требуются при использовании 2FA, подтверждения учетной записи и восстановления паролей и других функций безопасности.Identity Службы или заглушки служб не создаются при создании шаблонов Identity. Службы для включения этих функций необходимо добавить вручную. Например, см. статью "Настройка поставщика электронной почты ", чтобы приложение может требовать подтверждение электронной почты.

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

Создать структуру Identity в проекте Blazor

Описанные в этом разделе процедуры генерации шаблонного кода применяются к приложениям Blazor Web App и Blazor Server.

Запустите Identity scaffolder:

  1. В Обозреватель решений щелкните проект правой кнопкой мыши и выберите Add>New Scaffolded Item.

  2. На левой панели диалогового окна Добавить новый шаблонный элемент выберите Identity.

  3. В центральной области выберите Blazor Identityи нажмите кнопку "Добавить".

  4. В диалоговом окне «Добавление» BlazorIdentity:

    1. Выберите значок плюса (+) и добавьте класс контекста базы данных , класс DbContext.

    2. Выберите поставщика базы данных (поставщик базы данных), который по умолчанию используется для SQL Server.

    3. Выберите значок плюса (+) и добавьте класс пользователя, User class.

    4. Нажмите кнопку "Добавить".

Для сгенерированного кода базы данных Identity требуются миграции Entity Framework Core. Ниже описано, как создать и применить миграцию к базе данных.

Visual Studio Connected Services используются для добавления миграции Entity Framework Core и обновления базы данных.

  1. В Обозревателе решений дважды щелкните Подключенные службы.

  2. В области Service Dependencies для SQL Server Express LocalDB выберите Дополнительные действия (...) >Добавить миграцию.

  3. Дайте миграции имя миграции, например CreateIdentitySchema, то есть имя, описывающее миграцию.

    Дождитесь, пока контекст базы данных загрузится в поле с именами классов DbContext. Действие может занять несколько секунд.

  4. Нажмите кнопку "Готово ", чтобы завершить обновление. После завершения операции нажмите кнопку "Закрыть".

  5. Выбор дополнительных действий (...) >Обновление базы данных.

    Откроется диалоговое окно Обновление базы данных с помощью последней миграции.

    Дождитесь обновления поля имен классов DbContext и загрузки предыдущих миграций. Действие может занять несколько секунд.

  6. Нажмите кнопку "Готово ", чтобы завершить обновление. После завершения операции нажмите кнопку "Закрыть".

Команда update database выполняет миграции метода Up, которые еще не были применены, из файла кода миграции, созданного с помощью средства генерации шаблонов. В этом случае команда запускает Up метод в файле Migrations/{TIME STAMP}_{MIGRATION NAME}.cs , который создает Identity таблицы, ограничения и индексы. Заполнитель {TIME STAMP} — метка времени, а заполнитель {MIGRATION NAME} — имя миграции.

Клиентские Blazor приложения (автономные Blazor WebAssembly)

Клиентские Blazor приложения (автономные Blazor WebAssembly) используют собственные Identity подходы пользовательского интерфейса и не могут использовать шаблон ASP.NET Core Identity .

Дополнительные сведения см. в Blazor статье «Безопасность» и Identity других статьях.

Добавить Identity в проект без существующей Razor авторизации

Установите пакет NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Примечание.

Рекомендации по добавлению пакетов в приложения .NET см. в разделе Способы установки пакетов NuGet в статье Рабочий процесс использования пакета (документация по NuGet). Проверьте правильность версий пакета на сайте NuGet.org.


Запустите генератор Identity, выполнив следующие действия.

  1. В Обозреватель решений щелкните проект правой кнопкой мыши и выберите Add>New Scaffolded Item.

  2. В левой области диалогового окна "Добавить новый шаблонный элемент" выберите Identity.

  3. В центральной области выберите Identityи нажмите кнопку "Добавить".

  4. В диалоговом окне "Добавить" Identity выберите нужные параметры:

    1. Если у вас уже есть настроенная страница макета для Identity (_Layout.cshtml), выберите существующую страницу, чтобы избежать перезаписи вашего макета неправильной разметкой, создаваемой генератором шаблонного кода. Например, выберите один из следующих вариантов:

      • Pages/Shared/_Layout.cshtml для страниц Razor или для проектов Blazor Server с существующей инфраструктурой страниц Razor.
      • Views/Shared/_Layout.cshtml для проектов MVC или Blazor Server проектов с существующей инфраструктурой MVC.
    2. Выберите значок плюса (+) и добавьте класс контекста базы данных , класс DbContext. Чтобы добавить контекст данных, необходимо выбрать хотя бы один файл.

      • Чтобы создать контекст данных, выберите значок плюса (+). Примите значение по умолчанию или укажите новый класс для Identity.

      • Чтобы создать новый класс пользователя, выберите значок плюса (+) для класса User и укажите класс (например, ContosoUser для компании с именем Contoso).

    3. Выберите Добавить, чтобы запустить средство создания шаблона.

Миграции, UseAuthentication и компоновка

Сгенерированному коду базы данных Identity требуются миграции Entity Framework Core. Если миграция для создания Identity схемы еще не создана и применена к базе данных, используйте следующие процедуры для создания миграции и обновления базы данных.

Подключенные службы Visual Studio используются для добавления миграции EF Core и обновления базы данных.

  1. В Обозревателе решений дважды щелкните Подключенные службы.

  2. В области SQL Server Express LocalDB раздела Service Dependencies выберите Дополнительные действия (...) >Добавить миграцию.

  3. Дайте миграции имя миграции, например CreateIdentitySchema, то есть имя, описывающее миграцию.

    Дождитесь, пока контекст базы данных загрузится в поле с именами классов DbContext. Действие может занять несколько секунд.

  4. Нажмите кнопку "Готово ", чтобы завершить обновление. После завершения операции нажмите кнопку "Закрыть".

  5. Выбор дополнительных действий (...) >Обновление базы данных.

    Откроется диалоговое окно Обновление базы данных с помощью последней миграции.

    Дождитесь обновления поля имен классов DbContext и загрузки предыдущих миграций. Действие может занять несколько секунд.

  6. Нажмите кнопку "Готово ", чтобы завершить обновление. После завершения операции нажмите кнопку "Закрыть".

Команда update database запускает миграции метода Up, которые ещё не были применены и содержатся в файле кода миграции, созданном средством scaffolding. В этом случае команда запускает Up метод в файле Migrations/{TIME STAMP}_{MIGRATION NAME}.cs , который создает Identity таблицы, ограничения и индексы. Заполнитель {TIME STAMP} — метка времени, а заполнитель {MIGRATION NAME} — имя миграции.

Identity Если схема создана, но не применяется к базе данных, необходимо выполнить команду, чтобы обновить базу данных:

  1. В Обозревателе решений дважды щелкните Подключенные службы.

  2. В области SQL Server Express LocalDB раздела Зависимости служб выберите Дополнительные действия (...) >Обновить базу данных.

    Откроется диалоговое окно Обновление базы данных с помощью последней миграции.

    Дождитесь обновления поля имен классов DbContext и загрузки предыдущих миграций. Действие может занять несколько секунд.

  3. Нажмите кнопку "Готово ", чтобы завершить обновление. После завершения операции нажмите кнопку "Закрыть".

Вы можете подтвердить приложение схемы с помощью следующей Identity команды. Вывод команды содержит столбец applied, который показывает, какие миграции применены к базе данных.

В консоли Visual Studio диспетчер пакетов выполните команду Get-Migration:

Get-Migration

Если существует несколько контекстов базы данных, укажите контекст с параметром -Context .

Изменения макета

При необходимости можно добавить частичное представление для входа (_LoginPartial) в файл макета:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - WebRPnoAuth2Auth</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
    <link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
    <link rel="stylesheet" href="~/WebRPnoAuth2Auth.styles.css" asp-append-version="true" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">WebRPnoAuth2Auth</a>
                <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                        </li>
                    </ul>
                    <partial name="_LoginPartial" />
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2021 - WebRPnoAuth2Auth - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

    <script src="~/lib/jquery/dist/jquery.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

    @await RenderSectionAsync("Scripts", required: false)
</body>
</html>

Добавить шаблон Identity в проект Razor с авторизацией

Установите пакет NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Примечание.

Рекомендации по добавлению пакетов в приложения .NET см. в разделе Способы установки пакетов NuGet в статье Рабочий процесс использования пакета (документация по NuGet). Проверьте правильность версий пакета на сайте NuGet.org.


Запустите Identity scaffolder, выполнив следующие действия.

  1. В Обозреватель решений щелкните проект правой кнопкой мыши и выберите Add>New Scaffolded Item.

  2. В левой области диалогового окна "Добавление нового шаблонного элемента" выберите Identity.

  3. В центральной области выберите Identityи нажмите кнопку "Добавить".

  4. В диалоговом окне "Добавить" Identity выберите нужные параметры:

    1. Если у вас уже есть настроенная страница макета для Identity (_Layout.cshtml), выберите существующую страницу, чтобы средство формирования шаблонного кода не перезаписало ваш макет некорректной разметкой. Например, выберите один из следующих вариантов:

      • Pages/Shared/_Layout.cshtml для страниц Razor Pages или проектов Blazor Server с существующей инфраструктурой Razor Pages.
      • Views/Shared/_Layout.cshtml для проектов MVC или проектов Blazor Server с существующей инфраструктурой MVC.
    2. Выберите значок плюса (+) и добавьте класс контекста базы данных , класс DbContext. Чтобы добавить контекст данных, необходимо выбрать хотя бы один файл.

      • Чтобы создать контекст данных, выберите значок плюса (+). Примите значение по умолчанию или укажите класс (например, Contoso.Data.ApplicationDbContext для компании с именем Contoso).

      • Чтобы создать новый класс пользователя, выберите значок плюса (+) для класса User и укажите класс (например, ContosoUser для компании с именем Contoso).

    3. Выберите Добавить, чтобы запустить генератор шаблонов.

Добавление шаблонных страниц Identity в проект MVC, где авторизация еще не настроена

Установите пакет NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Примечание.

Рекомендации по добавлению пакетов в приложения .NET см. в разделе Способы установки пакетов NuGet в статье Рабочий процесс использования пакета (документация по NuGet). Проверьте правильность версий пакета на сайте NuGet.org.


Запустите Identity генератор, выполнив следующие действия.

  1. В Обозреватель решений щелкните проект правой кнопкой мыши и выберите Add>New Scaffolded Item.

  2. В левой области диалогового окна Добавить новый шаблонный элемент выберите Identity.

  3. В центральной области выберите Identityи нажмите кнопку "Добавить".

  4. В диалоговом окне "Добавить" Identity выберите нужные параметры:

    1. Если у вас уже есть существующая настроенная страница макета для Identity (_Layout.cshtml), выберите эту существующую страницу, чтобы средство генерации шаблонного кода не перезаписало ваш макет некорректной разметкой. Например, выберите один из следующих вариантов:

      • Pages/Shared/_Layout.cshtml для страниц Razor или проектов Blazor Server с существующей инфраструктурой страниц Razor.
      • Views/Shared/_Layout.cshtml для проектов MVC или Blazor Server проектов с существующей инфраструктурой MVC.
    2. Выберите значок плюса (+) и добавьте класс контекста базы данных , класс DbContext. Чтобы добавить контекст данных, необходимо выбрать хотя бы один файл.

      • Чтобы создать контекст данных, выберите значок плюса (+). Примите значение по умолчанию или укажите новый класс для Identity.

      • Чтобы создать новый класс пользователя, выберите значок плюса (+) для класса User и укажите класс (например, ContosoUser для компании с именем Contoso).

    3. Нажмите кнопку "Добавить ", чтобы запустить шаблон.

Необязательно: добавьте частичное представление для входа (_LoginPartial) в файл Views/Shared/_Layout.cshtml:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - WebRPnoAuth2Auth</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
    <link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
    <link rel="stylesheet" href="~/WebRPnoAuth2Auth.styles.css" asp-append-version="true" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">WebRPnoAuth2Auth</a>
                <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                        </li>
                    </ul>
                    <partial name="_LoginPartial" />
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2021 - WebRPnoAuth2Auth - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

    <script src="~/lib/jquery/dist/jquery.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

    @await RenderSectionAsync("Scripts", required: false)
</body>
</html>

Сгенерированный код базы данных Identity требует миграции Entity Framework Core. Если миграция для создания Identity схемы еще не создана и применена к базе данных, используйте следующие процедуры для создания миграции и обновления базы данных.

Подключенные службы Visual Studio используются для добавления миграции EF Core и обновления базы данных.

  1. В Обозревателе решений дважды щелкните Подключенные службы.

  2. В области SQL Server Express LocalDB раздела Зависимости служб выберите Дополнительные действия (...) >Добавить миграцию.

  3. Дайте миграции имя миграции, например CreateIdentitySchema, то есть имя, описывающее миграцию.

    Дождитесь, пока контекст базы данных загрузится в поле с именами классов DbContext. Действие может занять несколько секунд.

  4. Нажмите кнопку "Готово ", чтобы завершить обновление. После завершения операции нажмите кнопку "Закрыть".

  5. Выбор дополнительных действий (...) >Обновление базы данных.

    Откроется диалоговое окно Обновление базы данных с помощью последней миграции.

    Дождитесь обновления поля имен классов DbContext и загрузки предыдущих миграций. Действие может занять несколько секунд.

  6. Нажмите кнопку "Готово ", чтобы завершить обновление. После завершения операции нажмите кнопку "Закрыть".

Команда обновления базы данных выполняет миграции метода Up, которые ещё не были применены, в файле кода миграции, созданном средством генерации шаблонного кода. В этом случае команда запускает Up метод в файле Migrations/{TIME STAMP}_{MIGRATION NAME}.cs , который создает Identity таблицы, ограничения и индексы. Заполнитель {TIME STAMP} — метка времени, а заполнитель {MIGRATION NAME} — имя миграции.

Identity Если схема создана, но не применяется к базе данных, необходимо выполнить команду, чтобы обновить базу данных:

  1. В Обозревателе решений дважды щелкните Подключенные службы.

  2. В области SQL Server Express LocalDB в Service Dependencies выберите Дополнительные действия (...) >Обновить базу данных.

    Откроется диалоговое окно Обновление базы данных с помощью последней миграции.

    Дождитесь обновления поля имен классов DbContext и загрузки предыдущих миграций. Действие может занять несколько секунд.

  3. Нажмите кнопку "Готово ", чтобы завершить обновление. После завершения операции нажмите кнопку "Закрыть".

Вы можете подтвердить приложение схемы с помощью следующей Identity команды. Вывод команды содержит столбец applied, который показывает, какие миграции применены к базе данных.

В консоли Visual Studio диспетчер пакетов выполните команду Get-Migration:

Get-Migration

Если существует несколько контекстов базы данных, укажите контекст с параметром -Context .

Добавьте MapRazorPages в файл Program.cs , как показано в следующем выделенном коде:

using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebMVCauth.Data;

var builder = WebApplication.CreateBuilder(args);

var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();

builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddControllersWithViews();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseMigrationsEndPoint();
}
else
{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapRazorPages();

app.Run();

Добавить шаблонный код Identity в проект MVC с авторизацией

Установите пакет NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Примечание.

Рекомендации по добавлению пакетов в приложения .NET см. в разделе Способы установки пакетов NuGet в статье Рабочий процесс использования пакета (документация по NuGet). Проверьте правильность версий пакета на сайте NuGet.org.


Запустите Identity генератор шаблонов, выполнив следующие действия.

  1. В Обозреватель решений щелкните проект правой кнопкой мыши и выберите Add>New Scaffolded Item.

  2. В левой области диалогового окна "Добавить новый шаблонный элемент" выберите Identity.

  3. В центральной области выберите Identityи нажмите кнопку "Добавить".

  4. В диалоговом окне "Добавить" Identity выберите нужные параметры:

    1. Если у вас уже есть существующая страница настраиваемого макета для Identity (_Layout.cshtml), выберите эту существующую страницу, чтобы scaffolder не перезаписал ваш макет некорректной разметкой. Например, выберите один из следующих вариантов:

      • Pages/Shared/_Layout.cshtml для страниц Razor Pages или для проектов Blazor Server с существующей инфраструктурой Razor Pages.
      • Views/Shared/_Layout.cshtml для проектов MVC или для проектов Blazor Server с существующей инфраструктурой MVC.
    2. Выберите значок плюса (+) и добавьте класс контекста базы данных , класс DbContext. Чтобы добавить контекст данных, необходимо выбрать хотя бы один файл.

      • Чтобы создать контекст данных, выберите значок плюса (+). Примите значение по умолчанию или укажите класс (например, Contoso.Data.ApplicationDbContext для компании с именем Contoso).

      • Чтобы создать новый класс пользователя, выберите значок плюса (+) для класса User и укажите класс (например, ContosoUser для компании с именем Contoso).

    3. Выберите Добавить, чтобы запустить инструмент создания шаблонов.

Создайте полный исходный код Identity пользовательского интерфейса

Чтобы обеспечить полный контроль пользовательского Identity интерфейса, запустите Identity шаблон и выберите "Переопределить все файлы".

Настройка пароля

Если PasswordOptions настроены в Startup.ConfigureServices, для свойства Password на страницах Identity, созданных с помощью шаблонов, может потребоваться настройка StringLengthAttribute. Свойства InputModel и свойства Password находятся в следующих файлах:

  • Области/Страницы/IdentityAccount/Register.cshtml.cs
  • Области/страницы/Identityучетная запись/ResetPassword.cshtml.cs

Отключение страницы

В этом разделе описывается отключение страницы регистрации, но вы можете использовать тот же подход для отключения любой страницы.

Чтобы отключить регистрацию пользователей, выполните приведенные действия.

  1. Каркас Identity. Включить Account.Register, Account.Loginи Account.RegisterConfirmation. Например:

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  2. Обновите файл Areas/Identity/Pages/Account/Register.cshtml.cs, чтобы пользователи не могли регистрироваться через эту конечную точку:

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  3. Обновите файл Areas/Pages/IdentityAccount/Register.cshtml , чтобы он соответствовал предыдущим изменениям:

    @page
    @model RegisterModel
    @{
        ViewData["Title"] = "Go to Login";
    }
    
    <h1>@ViewData["Title"]</h1>
    
    <li class="nav-item">
        <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
    </li>
    
  4. Закомментируйте или удалите ссылку регистрации из файла Areas/Pages/IdentityAccount/Login.cshtml :

    @*
    <p>
        <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
    </p>
    *@
    
  5. Обновите страницу Areas/Identity/Pages/Account/RegisterConfirmation .

    • Удалите код и ссылки из CSHTML-файла .

    • Удалите код подтверждения из PageModel реализации:

    [AllowAnonymous]
    public class RegisterConfirmationModel : PageModel
    {
         public IActionResult OnGet()
         {  
             return Page();
         }
    }
    

Добавление пользователей с помощью другого приложения

Предоставьте механизм добавления пользователей за пределами веб-приложения. Возможные варианты добавления пользователей:

  • Выделенное веб-приложение администратора
  • Консольное приложение

Следующий код описывает один подход для добавления пользователей:

  • Чтение списка пользователей в память.
  • Создайте надежный уникальный пароль для каждого пользователя.
  • Добавьте пользователя в Identity базу данных.
  • Уведомите пользователя об изменении пароля.
public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();

        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;

            try
            {
                var context = services.GetRequiredService<AppDbCntx>();
                context.Database.Migrate();

                var config = host.Services.GetRequiredService<IConfiguration>();
                var userList = config.GetSection("userList").Get<List<string>>();

                SeedData.Initialize(services, userList).Wait();
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occurred adding users.");
            }
        }

        host.Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

Следующий код описывает добавление пользователя:


public static async Task Initialize(IServiceProvider serviceProvider,
                                    List<string> userList)
{
    var userManager = serviceProvider.GetService<UserManager<IdentityUser>>();

    foreach (var userName in userList)
    {
        var userPassword = GenerateSecurePassword();
        var userId = await EnsureUser(userManager, userName, userPassword);

        NotifyUser(userName, userPassword);
    }
}

private static async Task<string> EnsureUser(UserManager<IdentityUser> userManager,
                                             string userName, string userPassword)
{
    var user = await userManager.FindByNameAsync(userName);

    if (user == null)
    {
        user = new IdentityUser(userName)
        {
            EmailConfirmed = true
        };
        await userManager.CreateAsync(user, userPassword);
    }

    return user.Id;
}

Аналогичный подход можно использовать для рабочих сценариев.

Запретить публикацию статических Identity ресурсов

Сведения о предотвращении публикации статических Identity ресурсов в корневом каталоге веб-сайта см. в статье "Введение Identity в ASP.NET Core".

ASP.NET Core предоставляет ASP.NET Core Identity в Razor качестве библиотеки классов (RCL). Приложения, которые включают в себя Identity , могут применять шаблон для выборочного добавления исходного кода, содержащегося в Identity RCL. Вы можете создать исходный код, чтобы изменить код и тем самым изменить поведение. Например, вы можете указать генератору шаблонов сгенерировать код, используемый при регистрации. Сгенерированный код имеет приоритет над тем же кодом в Identity RCL. Чтобы получить полный контроль над пользовательским интерфейсом и не использовать RCL по умолчанию, см. раздел "Создание полного Identity источника пользовательского интерфейса".

Приложения, которые не включают проверку подлинности, могут применять шаблон для добавления пакета RCL Identity . Вы можете выбрать, какой код Identity будет создан.

Хотя шаблон создает большую часть необходимого кода, необходимо обновить проект, чтобы завершить процесс. В этом документе описаны шаги, необходимые для выполнения обновления Identity генерации каркаса.

Мы рекомендуем использовать систему управления версиями, которая показывает различия между файлами и позволяет отменять изменения. Проверьте изменения после запуска Identity для создания каркаса.

Службы требуются при использовании двухфакторной идентификации, подтверждения учетной записи и восстановления паролей и других функций безопасности.Identity Службы или заглушки служб не создаются при создании шаблонов Identity. Службы для включения этих функций необходимо добавить вручную. Например, см. раздел "Требовать подтверждение электронной почты".

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

Добавить Identity в проект без существующей Razor авторизации

Установите пакет NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Примечание.

Рекомендации по добавлению пакетов в приложения .NET см. в разделе Способы установки пакетов NuGet в статье Рабочий процесс использования пакета (документация по NuGet). Проверьте правильность версий пакета на сайте NuGet.org.


Запустите Identity генератор шаблонов, используя следующие процедуры.

  1. В Обозреватель решений щелкните проект правой кнопкой мыши и выберите Add>New Scaffolded Item.

  2. В левой области диалогового окна "Добавить новый шаблонный элемент" выберите Identity.

  3. В центральной области выберите Identityи нажмите кнопку "Добавить".

  4. В диалоговом окне "Добавить" Identity выберите нужные параметры:

    1. Если у вас уже есть существующая настраиваемая страница макета для Identity (_Layout.cshtml), выберите эту существующую страницу, чтобы генератор шаблонов не перезаписал ваш макет некорректной разметкой. Например, выберите один из следующих вариантов:

      • Pages/Shared/_Layout.cshtml для страниц Razor Pages или для проектов Blazor Server с существующей инфраструктурой Razor Pages.
      • Views/Shared/_Layout.cshtml для проектов MVC или проектов Blazor Server с существующей инфраструктурой MVC.
    2. Выберите значок плюса (+) и добавьте класс контекста базы данных , класс DbContext. Чтобы добавить контекст данных, необходимо выбрать хотя бы один файл.

      • Чтобы создать контекст данных, выберите значок плюса (+). Примите значение по умолчанию или укажите новый класс для Identity.

      • Чтобы создать новый класс пользователя, выберите значок плюса (+) для класса User и укажите класс (например, ContosoUser для компании с именем Contoso).

    3. Выберите Добавить, чтобы запустить генератор шаблонов.

Миграции, UseAuthentication и компоновка

Созданный код базы данных Identity требует миграции Entity Framework Core. Если миграция для создания Identity схемы еще не создана и применена к базе данных, используйте следующие процедуры для создания миграции и обновления базы данных.

Подключенные службы Visual Studio используются для добавления миграции EF Core и обновления базы данных.

  1. В Обозревателе решений дважды щелкните Подключенные службы.

  2. В разделе Зависимости службы в области SQL Server Express LocalDB выберите Дополнительные действия (...) >Добавить миграцию.

  3. Дайте миграции имя миграции, например CreateIdentitySchema, то есть имя, описывающее миграцию.

    Дождитесь, пока контекст базы данных загрузится в поле с именами классов DbContext. Действие может занять несколько секунд.

  4. Нажмите кнопку "Готово ", чтобы завершить обновление. После завершения операции нажмите кнопку "Закрыть".

  5. Выбор дополнительных действий (...) >Обновление базы данных.

    Откроется диалоговое окно Обновление базы данных с помощью последней миграции.

    Дождитесь обновления поля имен классов DbContext и загрузки предыдущих миграций. Действие может занять несколько секунд.

  6. Нажмите кнопку "Готово ", чтобы завершить обновление. После завершения операции нажмите кнопку "Закрыть".

Команда update database выполняет миграции метода Up, которые не были применены в файле кода миграции, созданном генератором шаблонов. В этом случае команда запускает Up метод в файле Migrations/{TIME STAMP}_{MIGRATION NAME}.cs , который создает Identity таблицы, ограничения и индексы. Заполнитель {TIME STAMP} — метка времени, а заполнитель {MIGRATION NAME} — имя миграции.

Identity Если схема создана, но не применяется к базе данных, необходимо выполнить команду, чтобы обновить базу данных:

  1. В Обозревателе решений дважды щелкните Подключенные службы.

  2. В области SQL Server Express LocalDB в Service Dependencies выберите Дополнительные действия (...) >Обновить базу данных.

    Откроется диалоговое окно Обновление базы данных с помощью последней миграции.

    Дождитесь обновления поля имен классов DbContext и загрузки предыдущих миграций. Действие может занять несколько секунд.

  3. Нажмите кнопку "Готово ", чтобы завершить обновление. После завершения операции нажмите кнопку "Закрыть".

Вы можете подтвердить приложение схемы с помощью следующей Identity команды. Вывод команды содержит столбец applied, который показывает, какие миграции применены к базе данных.

В консоли Visual Studio диспетчер пакетов выполните команду Get-Migration:

Get-Migration

Если существует несколько контекстов базы данных, укажите контекст с параметром -Context .

Изменения макета

Необязательно: добавьте частичное представление для входа (_LoginPartial) в файл макета:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - WebRPnoAuth2Auth</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
    <link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
    <link rel="stylesheet" href="~/WebRPnoAuth2Auth.styles.css" asp-append-version="true" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">WebRPnoAuth2Auth</a>
                <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                        </li>
                    </ul>
                    <partial name="_LoginPartial" />
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2021 - WebRPnoAuth2Auth - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

    <script src="~/lib/jquery/dist/jquery.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

    @await RenderSectionAsync("Scripts", required: false)
</body>
</html>

Добавить шаблон Identity в проект Razor с авторизацией

Установите пакет NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Примечание.

Рекомендации по добавлению пакетов в приложения .NET см. в разделе Способы установки пакетов NuGet в статье Рабочий процесс использования пакета (документация по NuGet). Проверьте правильность версий пакета на сайте NuGet.org.


Запустите генератор шаблонов Identity, выполнив следующие действия.

  1. В Обозреватель решений щелкните проект правой кнопкой мыши и выберите Add>New Scaffolded Item.

  2. В левой области диалогового окна "Добавить новый шаблонный элемент" выберите Identity.

  3. В центральной области выберите Identityи нажмите кнопку "Добавить".

  4. В диалоговом окне "Добавить" Identity выберите нужные параметры:

    1. Если у вас уже есть настроенная страница макета для Identity (_Layout.cshtml), выберите эту существующую страницу, чтобы избежать перезаписи макета некорректной разметкой, созданной генератором шаблонов. Например, выберите один из следующих вариантов:

      • Pages/Shared/_Layout.cshtml для страниц Razor или проектов Blazor Server с существующей инфраструктурой страниц Razor.
      • Views/Shared/_Layout.cshtml для проектов MVC или Blazor Server проектов с существующей инфраструктурой MVC.
    2. Выберите значок плюса (+) и добавьте класс контекста базы данных , класс DbContext. Чтобы добавить контекст данных, необходимо выбрать хотя бы один файл.

      • Чтобы создать контекст данных, выберите значок плюса (+). Примите значение по умолчанию или укажите класс (например, Contoso.Data.ApplicationDbContext для компании с именем Contoso).

      • Чтобы создать новый класс пользователя, выберите значок плюса (+) для класса User и укажите класс (например, ContosoUser для компании с именем Contoso).

    3. Выберите Добавить, чтобы запустить генератор каркаса.

Добавление шаблонных страниц Identity в проект MVC, где авторизация еще не настроена

Установите пакет NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Примечание.

Рекомендации по добавлению пакетов в приложения .NET см. в разделе Способы установки пакетов NuGet в статье Рабочий процесс использования пакета (документация по NuGet). Проверьте правильность версий пакета на сайте NuGet.org.


Запустите Identity генератор шаблонов, выполнив следующие действия.

  1. В Обозреватель решений щелкните проект правой кнопкой мыши и выберите Add>New Scaffolded Item.

  2. В левой области диалогового окна "Добавить новый шаблонный элемент" выберите Identity.

  3. В центральной области выберите Identityи нажмите кнопку "Добавить".

  4. В диалоговом окне "Добавить" Identity выберите нужные параметры:

    1. Если у вас уже есть существующая настроенная страница макета для Identity (_Layout.cshtml), выберите эту существующую страницу, чтобы не перезаписать ваш макет некорректной разметкой, созданной генератором шаблонного кода. Например, выберите один из следующих вариантов:

      • Pages/Shared/_Layout.cshtml для Razor Pages или проектов Blazor Server с существующей инфраструктурой страниц Razor.
      • Views/Shared/_Layout.cshtml для проектов MVC или Blazor Server проектов с существующей инфраструктурой MVC.
    2. Выберите значок плюса (+) и добавьте класс контекста базы данных , класс DbContext. Чтобы добавить контекст данных, необходимо выбрать хотя бы один файл.

      • Чтобы создать контекст данных, выберите значок плюса (+). Примите значение по умолчанию или укажите новый класс для Identity.

      • Чтобы создать новый класс пользователя, выберите значок плюса (+) для класса User и укажите класс (например, ContosoUser для компании с именем Contoso).

    3. Выберите Добавить, чтобы запустить средство создания шаблона.

Необязательно: добавьте частичное представление для входа (_LoginPartial) в файл Views/Shared/_Layout.cshtml:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - WebRPnoAuth2Auth</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
    <link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
    <link rel="stylesheet" href="~/WebRPnoAuth2Auth.styles.css" asp-append-version="true" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">WebRPnoAuth2Auth</a>
                <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                        </li>
                    </ul>
                    <partial name="_LoginPartial" />
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2021 - WebRPnoAuth2Auth - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

    <script src="~/lib/jquery/dist/jquery.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

    @await RenderSectionAsync("Scripts", required: false)
</body>
</html>

Для сгенерированного кода базы данных Identity требуются миграции Entity Framework Core. Если миграция для создания Identity схемы еще не создана и применена к базе данных, используйте следующие процедуры для создания миграции и обновления базы данных.

Подключенные службы Visual Studio используются для добавления миграции EF Core и обновления базы данных.

  1. В Обозревателе решений дважды щелкните Подключенные службы.

  2. В области SQL Server Express LocalDB раздела Service Dependencies выберите Дополнительные действия (...) >Добавить миграцию.

  3. Дайте миграции имя миграции, например CreateIdentitySchema, то есть имя, описывающее миграцию.

    Дождитесь, пока контекст базы данных загрузится в поле с именами классов DbContext. Действие может занять несколько секунд.

  4. Нажмите кнопку "Готово ", чтобы завершить обновление. После завершения операции нажмите кнопку "Закрыть".

  5. Выбор дополнительных действий (...) >Обновление базы данных.

    Откроется диалоговое окно Обновление базы данных с помощью последней миграции.

    Дождитесь обновления поля имен классов DbContext и загрузки предыдущих миграций. Действие может занять несколько секунд.

  6. Нажмите кнопку "Готово ", чтобы завершить обновление. После завершения операции нажмите кнопку "Закрыть".

Команда обновления базы данных запускает миграции метода Up, которые ещё не были применены и описаны в файле кода миграции, созданном средством автоматической генерации кода. В этом случае команда запускает Up метод в файле Migrations/{TIME STAMP}_{MIGRATION NAME}.cs , который создает Identity таблицы, ограничения и индексы. Заполнитель {TIME STAMP} — метка времени, а заполнитель {MIGRATION NAME} — имя миграции.

Identity Если схема создана, но не применяется к базе данных, необходимо выполнить команду, чтобы обновить базу данных:

  1. В Обозревателе решений дважды щелкните Подключенные службы.

  2. В области SQL Server Express LocalDB в Зависимости служб выберите Дополнительные действия (...) >Обновить базу данных.

    Откроется диалоговое окно Обновление базы данных с помощью последней миграции.

    Дождитесь обновления поля имен классов DbContext и загрузки предыдущих миграций. Действие может занять несколько секунд.

  3. Нажмите кнопку "Готово ", чтобы завершить обновление. После завершения операции нажмите кнопку "Закрыть".

Вы можете подтвердить приложение схемы с помощью следующей Identity команды. Вывод команды содержит столбец applied, который показывает, какие миграции применены к базе данных.

В консоли Visual Studio диспетчер пакетов выполните команду Get-Migration:

Get-Migration

Если существует несколько контекстов базы данных, укажите контекст с параметром -Context .

Добавьте MapRazorPages в Program.cs, как показано в следующем выделенном фрагменте кода:

using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebMVCauth.Data;

var builder = WebApplication.CreateBuilder(args);

var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();

builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddControllersWithViews();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseMigrationsEndPoint();
}
else
{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapRazorPages();

app.Run();

Добавить шаблонный код Identity в проект MVC с авторизацией

Установите пакет NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Примечание.

Рекомендации по добавлению пакетов в приложения .NET см. в разделе Способы установки пакетов NuGet в статье Рабочий процесс использования пакета (документация по NuGet). Проверьте правильность версий пакета на сайте NuGet.org.


Запустите генератор каркаса Identity, выполнив следующие действия.

  1. В Обозреватель решений щелкните проект правой кнопкой мыши и выберите Add>New Scaffolded Item.

  2. В левой области диалогового окна "Добавить новый шаблонный элемент" выберите Identity.

  3. В центральной области выберите Identityи нажмите кнопку "Добавить".

  4. В диалоговом окне "Добавить" Identity выберите нужные параметры:

    1. Если у вас уже есть настроенная страница макета для Identity (_Layout.cshtml), выберите существующую страницу, чтобы средство автоматической генерации не перезаписало ваш макет некорректной разметкой. Например, выберите один из следующих вариантов:

      • Pages/Shared/_Layout.cshtml для страниц Razor или для проектов Blazor Server с существующей инфраструктурой страниц Razor.
      • Views/Shared/_Layout.cshtml для проектов MVC или проектов Blazor Server с существующей инфраструктурой MVC.
    2. Выберите значок плюса (+) и добавьте класс контекста базы данных , класс DbContext. Чтобы добавить контекст данных, необходимо выбрать хотя бы один файл.

      • Чтобы создать контекст данных, выберите значок плюса (+). Примите значение по умолчанию или укажите класс (например, Contoso.Data.ApplicationDbContext для компании с именем Contoso).

      • Чтобы создать новый класс пользователя, выберите значок плюса (+) для класса User и укажите класс (например, ContosoUser для компании с именем Contoso).

    3. Выберите Добавить, чтобы запустить генератор шаблона.

Создать шаблон Identity для серверного Blazor приложения с авторизацией

Установите пакет NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Примечание.

Рекомендации по добавлению пакетов в приложения .NET см. в разделе Способы установки пакетов NuGet в статье Рабочий процесс использования пакета (документация по NuGet). Проверьте правильность версий пакета на сайте NuGet.org.


Запустите генератор шаблона Identity, выполнив следующие действия.

  1. В Обозреватель решений щелкните проект правой кнопкой мыши и выберите Add>New Scaffolded Item.

  2. В левой области диалогового окна "Добавить новый шаблонный элемент" выберите Identity.

  3. В центральной области выберите Identityи нажмите кнопку "Добавить".

  4. В диалоговом окне "Добавить" Identity выберите нужные параметры:

    1. Если у вас уже есть настроенная страница макета для Identity (_Layout.cshtml), выберите существующую страницу, чтобы средство scaffolding не перезаписало ваш макет некорректной разметкой. Например, выберите один из следующих вариантов:

      • Pages/Shared/_Layout.cshtml для страниц Razor или проектов Blazor Server с уже существующей инфраструктурой Razor Pages.
      • Views/Shared/_Layout.cshtml для проектов MVC или проектов Blazor Server с существующей инфраструктурой MVC.
    2. Выберите значок плюса (+) и добавьте класс контекста базы данных , класс DbContext. Чтобы добавить контекст данных, необходимо выбрать хотя бы один файл.

      • Чтобы создать контекст данных, выберите значок плюса (+). Примите значение по умолчанию или укажите класс (например, Contoso.Data.ApplicationDbContext для компании с именем Contoso).

      • Чтобы создать новый класс пользователя, выберите значок плюса (+) для класса User и укажите класс (например, ContosoUser для компании с именем Contoso).

    3. Нажмите кнопку "Добавить ", чтобы запустить шаблон.

Миграции

Для сгенерированного кода базы данных Identity требуются миграции Entity Framework Core. Если миграция для создания Identity схемы еще не создана и применена к базе данных, используйте следующие процедуры для создания миграции и обновления базы данных.

Подключенные службы Visual Studio используются для добавления миграции EF Core и обновления базы данных.

  1. В Обозревателе решений дважды щелкните Подключенные службы.

  2. В области SQL Server Express LocalDB раздела Service Dependencies выберите Дополнительные действия (...) >Добавить миграцию.

  3. Дайте миграции имя миграции, например CreateIdentitySchema, то есть имя, описывающее миграцию.

    Дождитесь, пока контекст базы данных загрузится в поле с именами классов DbContext. Действие может занять несколько секунд.

  4. Нажмите кнопку "Готово ", чтобы завершить обновление. После завершения операции нажмите кнопку "Закрыть".

  5. Выбор дополнительных действий (...) >Обновление базы данных.

    Откроется диалоговое окно Обновление базы данных с помощью последней миграции.

    Дождитесь обновления поля имен классов DbContext и загрузки предыдущих миграций. Действие может занять несколько секунд.

  6. Нажмите кнопку "Готово ", чтобы завершить обновление. После завершения операции нажмите кнопку "Закрыть".

Команда базы данных обновления выполняет Up миграцию методов, которые не применяются в файле кода миграции, созданном шаблоном. В этом случае команда запускает Up метод в файле Migrations/{TIME STAMP}_{MIGRATION NAME}.cs , который создает Identity таблицы, ограничения и индексы. Заполнитель {TIME STAMP} — метка времени, а заполнитель {MIGRATION NAME} — имя миграции.

Identity Если схема создана, но не применяется к базе данных, необходимо выполнить команду, чтобы обновить базу данных:

  1. В Обозревателе решений дважды щелкните Подключенные службы.

  2. В области SQL Server Express LocalDB раздела Service Dependencies выберите Дополнительные действия (...) >Обновить базу данных.

    Откроется диалоговое окно Обновление базы данных с помощью последней миграции.

    Дождитесь обновления поля имен классов DbContext и загрузки предыдущих миграций. Действие может занять несколько секунд.

  3. Нажмите кнопку "Готово ", чтобы завершить обновление. После завершения операции нажмите кнопку "Закрыть".

Вы можете подтвердить приложение схемы с помощью следующей Identity команды. Вывод команды содержит столбец applied, который показывает, какие миграции применены к базе данных.

В консоли Visual Studio диспетчер пакетов выполните команду Get-Migration:

Get-Migration

Если существует несколько контекстов базы данных, укажите контекст с параметром -Context .

Эндпоинты аутентификации Style

Так как серверные Blazor приложения используют Razor страницы Pages Identity , стилизация пользовательского интерфейса изменяется при переходе посетителя между Identity страницами и компонентами. У вас есть два варианта, чтобы решить проблему несогласованных стилей:

Пользовательские Identity компоненты

ASP.NET Core Identity предназначен для работы в контексте http-запроса и обмена ответами, который не является основной моделью взаимодействия с клиентом-сервером в Blazor приложениях. В приложениях ASP.NET Core, применяющих ASP.NET Core Identity для управления пользователями, следует использовать Razor Pages вместо компонентов Razor для пользовательского интерфейса, связанного с Identity, например для регистрации пользователей, входа, выхода и других задач управления пользователями.

Поскольку SignInManager<TUser> и UserManager<TUser> не поддерживаются компонентами Razor, мы рекомендуем использовать веб-API для управления действиями Identity из компонентов Razor через серверное приложение ASP.NET Core с поддержкой Identity. Сведения о создании веб-API для приложений Blazor см. в статье Вызов веб-API из приложения ASP.NET Core Blazor.

Подход к использованию Razor компонентов вместо IdentityRazor страниц заключается в создании собственных пользовательских IdentityRazor компонентов, но корпорация Майкрософт не рекомендует или не поддерживает подход. Дополнительные сведения см. в следующих обсуждениях. В следующих обсуждениях примеры кода в комментариях о проблемах и примерах кода, связанных между собой в репозиториях, отличных от Microsoft GitHub, не поддерживаются корпорацией Майкрософт, но могут оказаться полезными для некоторых разработчиков:

Для получения дополнительной помощи при поиске пользовательских IdentityRazor компонентов или поиске сторонних Razor компонентов рекомендуется использовать следующие ресурсы:

Используйте пользовательский макет со стилями приложения Blazor

Макет Identity и стили страниц можно изменить для создания страниц, использующих стили, аналогичные теме по умолчанию Blazor . Этот подход не рассматривается в документации.

Клиентские Blazor приложения

Клиентские Blazor приложения используют собственные Identity подходы пользовательского интерфейса и не могут использовать шаблон ASP.NET Core Identity . Серверные приложения ASP.NET Core для размещённых Blazor решений могут следовать рекомендациям Razor по Pages/MVC, приведённым в этой статье, и настраиваются так же, как и любой другой тип приложений ASP.NET Core, поддерживающих Identity.

Платформа Blazor не включает Razor версии компонентов страниц пользовательского Identity интерфейса. Identity Компоненты пользовательского интерфейса Razor можно создавать или получать из неподдерживаемых сторонних источников.

Дополнительные сведения см. в Blazor статье «Безопасность» и Identity других статьях.

Создайте полный исходный код Identity пользовательского интерфейса

Чтобы обеспечить полный контроль пользовательского Identity интерфейса, запустите Identity шаблон и выберите "Переопределить все файлы".

Настройка пароля

Если PasswordOptions настроены в Startup.ConfigureServices, для свойства [StringLength] на страницах , созданных с помощью генерации шаблонов, может потребоваться настройка атрибута Password. InputModel Password свойства находятся в следующих файлах:

  • Areas/Identity/Pages/Account/Register.cshtml.cs
  • Areas/Identity/Pages/Account/ResetPassword.cshtml.cs

Отключение страницы

В этом разделе показано, как отключить страницу регистрации, но этот подход можно использовать для отключения любой страницы.

Чтобы отключить регистрацию пользователей, выполните приведенные действия.

  • Каркас Identity. Включите Account.Register, Account.Login и Account.RegisterConfirmation. Например:

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  • Обновите Areas/Identity/Pages/Account/Register.cshtml.cs, чтобы пользователи не могли регистрироваться через эту конечную точку:

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • Обновление Areas/Identity/Pages/Account/Register.cshtml для согласованности с предыдущими изменениями:

    @page
    @model RegisterModel
    @{
        ViewData["Title"] = "Go to Login";
    }
    
    <h1>@ViewData["Title"]</h1>
    
    <li class="nav-item">
        <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
    </li>
    
  • Закомментируйте или удалите ссылку регистрации из Areas/Identity/Pages/Account/Login.cshtml

    @*
    <p>
        <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
    </p>
    *@
    
  • Обновите страницу Areas/Identity/Pages/Account/RegisterConfirmation .

    • Удалите код и ссылки из cshtml-файла.
    • Удалите код подтверждения из :PageModel
    [AllowAnonymous]
      public class RegisterConfirmationModel : PageModel
      {
          public IActionResult OnGet()
          {  
              return Page();
          }
      }
    

Добавление пользователей с помощью другого приложения

Предоставьте механизм добавления пользователей за пределами веб-приложения. Возможные варианты добавления пользователей:

  • Выделенное веб-приложение администратора.
  • Консольное приложение.

Следующий код описывает один подход к добавлению пользователей:

  • Список пользователей считывается в память.
  • Для каждого пользователя создается надежный уникальный пароль.
  • Пользователь добавляется в Identity базу данных.
  • Пользователь уведомляется и сообщает об изменении пароля.
public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();

        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;

            try
            {
                var context = services.GetRequiredService<AppDbCntx>();
                context.Database.Migrate();

                var config = host.Services.GetRequiredService<IConfiguration>();
                var userList = config.GetSection("userList").Get<List<string>>();

                SeedData.Initialize(services, userList).Wait();
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occurred adding users.");
            }
        }

        host.Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

Следующий код описывает добавление пользователя:


public static async Task Initialize(IServiceProvider serviceProvider,
                                    List<string> userList)
{
    var userManager = serviceProvider.GetService<UserManager<IdentityUser>>();

    foreach (var userName in userList)
    {
        var userPassword = GenerateSecurePassword();
        var userId = await EnsureUser(userManager, userName, userPassword);

        NotifyUser(userName, userPassword);
    }
}

private static async Task<string> EnsureUser(UserManager<IdentityUser> userManager,
                                             string userName, string userPassword)
{
    var user = await userManager.FindByNameAsync(userName);

    if (user == null)
    {
        user = new IdentityUser(userName)
        {
            EmailConfirmed = true
        };
        await userManager.CreateAsync(user, userPassword);
    }

    return user.Id;
}

Аналогичный подход можно использовать для рабочих сценариев.

Запретить публикацию статических Identity ресурсов

Сведения о предотвращении публикации статических Identity ресурсов в корневом каталоге веб-сайта см. в статье "Введение Identity в ASP.NET Core".

ASP.NET Core предоставляет ASP.NET Core Identity в Razor качестве библиотеки классов (RCL). Приложения, которые включают в себя Identity , могут применять шаблон для выборочного добавления исходного кода, содержащегося в Identity RCL. Вы можете создать исходный код, чтобы изменить код и тем самым изменить поведение. Например, вы можете указать генератору шаблонов сгенерировать код, используемый при регистрации. Сгенерированный код имеет приоритет над тем же кодом в Identity RCL. Чтобы получить полный контроль над пользовательским интерфейсом и не использовать RCL по умолчанию, см. раздел "Создание полного Identity источника пользовательского интерфейса".

Приложения, которые не включают проверку подлинности, могут применять шаблон для добавления пакета RCL Identity . Вы можете выбрать, какой код Identity будет создан.

Хотя шаблон создает большую часть необходимого кода, необходимо обновить проект, чтобы завершить процесс. В этом документе описаны шаги, необходимые для выполнения обновления Identity генерации каркаса.

Мы рекомендуем использовать систему управления версиями, которая показывает различия между файлами и позволяет отменять изменения. Проверьте изменения после запуска Identity для создания каркаса.

Службы требуются при использовании двухфакторной идентификации, подтверждения учетной записи и восстановления паролей и других функций безопасности.Identity Службы или заглушки служб не создаются при создании шаблонов Identity. Службы для включения этих функций необходимо добавить вручную. Например, см. раздел "Требовать подтверждение электронной почты".

При добавлении шаблонного кода Identity с новым контекстом данных в проекте с существующими индивидуальными учетными записями откройте Startup.ConfigureServices и удалите вызовы:

  • AddDbContext
  • AddDefaultIdentity

Например, AddDbContext и AddDefaultIdentity закомментированы в следующем коде:

public void ConfigureServices(IServiceCollection services)
{
    //services.AddDbContext<ApplicationDbContext>(options =>
    //    options.UseSqlServer(
    //        Configuration.GetConnectionString("DefaultConnection")));
    //services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    //    .AddEntityFrameworkStores<ApplicationDbContext>();
    services.AddControllersWithViews();
    services.AddRazorPages();
}

Предыдущий код примечает код, повторяющийся в Areas/Identity/IdentityHostingStartup.cs

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

Сгенерировать Identity в пустой проект

Запустите генератор шаблона Identity, следуя приведённым ниже инструкциям.

  1. В Обозреватель решений щелкните проект правой кнопкой мыши и выберите Add>New Scaffolded Item.

  2. В левой области диалогового окна "Добавить новый шаблонный элемент" выберите Identity.

  3. В центральной области выберите Identityи нажмите кнопку "Добавить".

  4. В диалоговом окне "Добавить" Identity выберите нужные параметры:

    1. Если у вас уже есть настроенная страница макета для Identity (_Layout.cshtml), выберите существующую страницу, чтобы генератор шаблонов не перезаписал ваш макет неправильной разметкой. Например, выберите один из следующих вариантов:

      • Pages/Shared/_Layout.cshtml для Razor Pages или Blazor Server проектов с существующей инфраструктурой Razor Pages.
      • Views/Shared/_Layout.cshtml для проектов MVC или проектов Blazor Server с существующей инфраструктурой MVC.
    2. Выберите значок плюса (+) и добавьте класс контекста базы данных , класс DbContext. Чтобы добавить контекст данных, необходимо выбрать хотя бы один файл.

      • Чтобы создать контекст данных, выберите значок плюса (+). Примите значение по умолчанию или укажите новый класс для Identity.

      • Чтобы создать новый класс пользователя, выберите значок плюса (+) для класса User и укажите класс (например, ContosoUser для компании с именем Contoso).

    3. Выберите Add, чтобы запустить генератор шаблонов.

Обновите класс Startup, добавив код, аналогичный приведённому ниже:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }
        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
            endpoints.MapRazorPages();
        });
    }
}

UseHsts рекомендуется, но не требуется. Дополнительные сведения см. в разделе HTTP Strict Transport Security Protocol.

Сгенерированный код базы данных Identity требует миграции Entity Framework Core. Если миграция для создания Identity схемы еще не создана и применена к базе данных, используйте следующие процедуры для создания миграции и обновления базы данных.

Подключенные службы Visual Studio используются для добавления миграции EF Core и обновления базы данных.

  1. В Обозревателе решений дважды щелкните Подключенные службы.

  2. В разделе Service Dependencies в области SQL Server Express LocalDB выберите Дополнительные действия (...) >Добавить миграцию.

  3. Дайте миграции имя миграции, например CreateIdentitySchema, то есть имя, описывающее миграцию.

    Дождитесь, пока контекст базы данных загрузится в поле с именами классов DbContext. Действие может занять несколько секунд.

  4. Нажмите кнопку "Готово ", чтобы завершить обновление. После завершения операции нажмите кнопку "Закрыть".

  5. Выбор дополнительных действий (...) >Обновление базы данных.

    Откроется диалоговое окно Обновление базы данных с помощью последней миграции.

    Дождитесь обновления поля имен классов DbContext и загрузки предыдущих миграций. Действие может занять несколько секунд.

  6. Нажмите кнопку "Готово ", чтобы завершить обновление. После завершения операции нажмите кнопку "Закрыть".

Команда update database выполняет миграции метода Up, которые не были применены в файле кода миграции, созданном scaffolder. В этом случае команда запускает Up метод в файле Migrations/{TIME STAMP}_{MIGRATION NAME}.cs , который создает Identity таблицы, ограничения и индексы. Заполнитель {TIME STAMP} — метка времени, а заполнитель {MIGRATION NAME} — имя миграции.

Identity Если схема создана, но не применяется к базе данных, необходимо выполнить команду, чтобы обновить базу данных:

  1. В Обозревателе решений дважды щелкните Подключенные службы.

  2. В области SQL Server Express LocalDB раздела Service Dependencies выберите Дополнительные действия (...) >Обновить базу данных.

    Откроется диалоговое окно Обновление базы данных с помощью последней миграции.

    Дождитесь обновления поля имен классов DbContext и загрузки предыдущих миграций. Действие может занять несколько секунд.

  3. Нажмите кнопку "Готово ", чтобы завершить обновление. После завершения операции нажмите кнопку "Закрыть".

Вы можете подтвердить приложение схемы с помощью следующей Identity команды. Вывод команды содержит столбец applied, который показывает, какие миграции применены к базе данных.

В консоли Visual Studio диспетчер пакетов выполните команду Get-Migration:

Get-Migration

Если существует несколько контекстов базы данных, укажите контекст с параметром -Context .

Добавить Identity в проект без существующей Razor авторизации

Запустите Identity генератор, выполнив следующие действия.

  1. В Обозреватель решений щелкните проект правой кнопкой мыши и выберите Add>New Scaffolded Item.

  2. В левой области диалогового окна "Добавить новый шаблонный элемент" выберите Identity.

  3. В центральной области выберите Identityи нажмите кнопку "Добавить".

  4. В диалоговом окне "Добавить" Identity выберите нужные параметры:

    1. Если у вас уже есть существующая пользовательская страница макета для Identity (_Layout.cshtml), выберите эту страницу, чтобы генератор шаблонов не перезаписал ваш макет неправильной разметкой. Например, выберите один из следующих вариантов:

      • Pages/Shared/_Layout.cshtml для страниц Razor или проектов Blazor Server с существующей инфраструктурой страниц Razor.
      • Views/Shared/_Layout.cshtml для проектов MVC или Blazor Server проектов с существующей инфраструктурой MVC.
    2. Выберите значок плюса (+) и добавьте класс контекста базы данных , класс DbContext. Чтобы добавить контекст данных, необходимо выбрать хотя бы один файл.

      • Чтобы создать контекст данных, выберите значок плюса (+). Примите значение по умолчанию или укажите новый класс для Identity.

      • Чтобы создать новый класс пользователя, выберите значок плюса (+) для класса User и укажите класс (например, ContosoUser для компании с именем Contoso).

    3. Выберите Добавить, чтобы запустить генератор шаблона.

Identity настраивается в Areas/Identity/IdentityHostingStartup.cs. Дополнительные сведения см. в разделе IHostingStartup.

Миграции, UseAuthentication и компоновка

Для сгенерированного кода базы данных Identity требуются миграции Entity Framework Core. Если миграция для создания Identity схемы еще не создана и применена к базе данных, используйте следующие процедуры для создания миграции и обновления базы данных.

Подключенные службы Visual Studio используются для добавления миграции EF Core и обновления базы данных.

  1. В Обозревателе решений дважды щелкните Подключенные службы.

  2. В разделе Service Dependencies, в области SQL Server Express LocalDB, выберите Дополнительные действия (...) >Добавить миграцию.

  3. Дайте миграции имя миграции, например CreateIdentitySchema, то есть имя, описывающее миграцию.

    Дождитесь, пока контекст базы данных загрузится в поле с именами классов DbContext. Действие может занять несколько секунд.

  4. Нажмите кнопку "Готово ", чтобы завершить обновление. После завершения операции нажмите кнопку "Закрыть".

  5. Выбор дополнительных действий (...) >Обновление базы данных.

    Откроется диалоговое окно Обновление базы данных с помощью последней миграции.

    Дождитесь обновления поля имен классов DbContext и загрузки предыдущих миграций. Действие может занять несколько секунд.

  6. Нажмите кнопку "Готово ", чтобы завершить обновление. После завершения операции нажмите кнопку "Закрыть".

Команда update database выполняет миграции метода Up, которые ещё не были применены и указаны в файле кода миграции, созданном генератором. В этом случае команда запускает Up метод в файле Migrations/{TIME STAMP}_{MIGRATION NAME}.cs , который создает Identity таблицы, ограничения и индексы. Заполнитель {TIME STAMP} — метка времени, а заполнитель {MIGRATION NAME} — имя миграции.

Identity Если схема создана, но не применяется к базе данных, необходимо выполнить команду, чтобы обновить базу данных:

  1. В Обозревателе решений дважды щелкните Подключенные службы.

  2. В области SQL Server Express LocalDB в разделе Зависимости служб выберите Дополнительные действия (...) >Обновить базу данных.

    Откроется диалоговое окно Обновление базы данных с помощью последней миграции.

    Дождитесь обновления поля имен классов DbContext и загрузки предыдущих миграций. Действие может занять несколько секунд.

  3. Нажмите кнопку "Готово ", чтобы завершить обновление. После завершения операции нажмите кнопку "Закрыть".

Вы можете подтвердить приложение схемы с помощью следующей Identity команды. Вывод команды содержит столбец applied, который показывает, какие миграции применены к базе данных.

В консоли Visual Studio диспетчер пакетов выполните команду Get-Migration:

Get-Migration

Если существует несколько контекстов базы данных, укажите контекст с параметром -Context .

Включение проверки подлинности

Обновите класс Startup, добавив код, аналогичный приведённому ниже:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }
}

UseHsts рекомендуется, но не требуется. Дополнительные сведения см. в разделе HTTP Strict Transport Security Protocol.

Изменения макета

Необязательно: добавьте частичное представление для входа (_LoginPartial) в файл макета:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - WebRP</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
    <link rel="stylesheet" href="~/css/site.css" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">WebRP</a>
                <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
                    <partial name="_LoginPartial" />
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                        </li>
                    </ul>
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2019 - WebRP - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

    <script src="~/lib/jquery/dist/jquery.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

    @RenderSection("Scripts", required: false)
</body>
</html>

Добавить шаблон Identity в проект Razor с авторизацией

Запустите Identity scaffolder, следуя приведённым ниже инструкциям.

  1. В Обозреватель решений щелкните проект правой кнопкой мыши и выберите Add>New Scaffolded Item.

  2. В левой области диалогового окна "Добавить новый шаблонный элемент" выберите Identity.

  3. В центральной области выберите Identityи нажмите кнопку "Добавить".

  4. В диалоговом окне "Добавить" Identity выберите нужные параметры:

    1. Если у вас уже есть настроенная страница макета для Identity (_Layout.cshtml), выберите существующую страницу, чтобы избежать перезаписи вашего макета неправильной разметкой, создаваемой генератором шаблонов. Например, выберите один из следующих вариантов:

      • Pages/Shared/_Layout.cshtml для страниц Razor или проектов Blazor Server с существующей инфраструктурой страниц Razor.
      • Views/Shared/_Layout.cshtml для проектов MVC или проектов Blazor Server с существующей инфраструктурой MVC.
    2. Выберите значок плюса (+) и добавьте класс контекста базы данных , класс DbContext. Чтобы добавить контекст данных, необходимо выбрать хотя бы один файл.

      • Чтобы создать контекст данных, выберите значок плюса (+). Примите значение по умолчанию или укажите класс (например, Contoso.Data.ApplicationDbContext для компании с именем Contoso).

      • Чтобы создать новый класс пользователя, выберите значок плюса (+) для класса User и укажите класс (например, ContosoUser для компании с именем Contoso).

    3. Выберите Добавить, чтобы запустить генератор.

Некоторые Identity параметры настроены в Areas/Identity/IdentityHostingStartup.cs. Дополнительные сведения см. в разделе IHostingStartup.

Добавление шаблонных страниц Identity в проект MVC, где авторизация еще не настроена

Запустите Identity генератор шаблонов, выполнив следующие действия.

  1. В Обозреватель решений щелкните проект правой кнопкой мыши и выберите Add>New Scaffolded Item.

  2. В левой области диалогового окна "Добавить новый шаблонный элемент" выберите Identity.

  3. В центральной области выберите Identityи нажмите кнопку "Добавить".

  4. В диалоговом окне "Добавить" Identity выберите нужные параметры:

    1. Если у вас уже есть настроенная страница макета для Identity (_Layout.cshtml), выберите существующую страницу, чтобы генератор шаблонного кода не перезаписал ваш макет некорректной разметкой. Например, выберите один из следующих вариантов:

      • Pages/Shared/_Layout.cshtml для Razor Pages или Blazor Server проектов с существующей инфраструктурой Razor Pages.
      • Views/Shared/_Layout.cshtml для проектов MVC или Blazor Server проектов с существующей инфраструктурой MVC.
    2. Выберите значок плюса (+) и добавьте класс контекста базы данных , класс DbContext. Чтобы добавить контекст данных, необходимо выбрать хотя бы один файл.

      • Чтобы создать контекст данных, выберите значок плюса (+). Примите значение по умолчанию или укажите новый класс для Identity.

      • Чтобы создать новый класс пользователя, выберите значок плюса (+) для класса User и укажите класс (например, ContosoUser для компании с именем Contoso).

    3. Выберите Add, чтобы запустить генератор каркаса.

Необязательно: добавьте частичное представление для входа (_LoginPartial) в файл Views/Shared/_Layout.cshtml:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - WebRP</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
    <link rel="stylesheet" href="~/css/site.css" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">WebRP</a>
                <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
                    <partial name="_LoginPartial" />
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                        </li>
                    </ul>
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2019 - WebRP - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

    <script src="~/lib/jquery/dist/jquery.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

    @RenderSection("Scripts", required: false)
</body>
</html>

Переместите файл Pages/Shared/_LoginPartial.cshtmlв Views/Shared/_LoginPartial.cshtml .

Identity настраивается в Areas/Identity/IdentityHostingStartup.cs. Дополнительные сведения см. в разделе IHostingStartup.

Сгенерированный код базы данных Identity требует миграции Entity Framework Core. Если миграция для создания Identity схемы еще не создана и применена к базе данных, используйте следующие процедуры для создания миграции и обновления базы данных.

Подключенные службы Visual Studio используются для добавления миграции EF Core и обновления базы данных.

  1. В Обозревателе решений дважды щелкните Подключенные службы.

  2. В разделе Service Dependencies в области SQL Server Express LocalDB выберите Дополнительные действия (...) >Добавить миграцию.

  3. Дайте миграции имя миграции, например CreateIdentitySchema, то есть имя, описывающее миграцию.

    Дождитесь, пока контекст базы данных загрузится в поле с именами классов DbContext. Действие может занять несколько секунд.

  4. Нажмите кнопку "Готово ", чтобы завершить обновление. После завершения операции нажмите кнопку "Закрыть".

  5. Выбор дополнительных действий (...) >Обновление базы данных.

    Откроется диалоговое окно Обновление базы данных с помощью последней миграции.

    Дождитесь обновления поля имен классов DbContext и загрузки предыдущих миграций. Действие может занять несколько секунд.

  6. Нажмите кнопку "Готово ", чтобы завершить обновление. После завершения операции нажмите кнопку "Закрыть".

Команда базы данных обновления выполняет Up миграцию методов, которые не применяются в файле кода миграции, созданном шаблоном. В этом случае команда запускает Up метод в файле Migrations/{TIME STAMP}_{MIGRATION NAME}.cs , который создает Identity таблицы, ограничения и индексы. Заполнитель {TIME STAMP} — метка времени, а заполнитель {MIGRATION NAME} — имя миграции.

Identity Если схема создана, но не применяется к базе данных, необходимо выполнить команду, чтобы обновить базу данных:

  1. В Обозревателе решений дважды щелкните Подключенные службы.

  2. В области SQL Server Express LocalDB в разделе Зависимости служб выберите Дополнительные действия (...) >Обновить базу данных.

    Откроется диалоговое окно Обновление базы данных с помощью последней миграции.

    Дождитесь обновления поля имен классов DbContext и загрузки предыдущих миграций. Действие может занять несколько секунд.

  3. Нажмите кнопку "Готово ", чтобы завершить обновление. После завершения операции нажмите кнопку "Закрыть".

Вы можете подтвердить приложение схемы с помощью следующей Identity команды. Вывод команды содержит столбец applied, который показывает, какие миграции применены к базе данных.

В консоли Visual Studio диспетчер пакетов выполните команду Get-Migration:

Get-Migration

Если существует несколько контекстов базы данных, укажите контекст с параметром -Context .

Обновите класс Startup, добавив код, аналогичный приведённому ниже:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }
        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
            endpoints.MapRazorPages();
        });
    }
}

UseHsts рекомендуется, но не требуется. Дополнительные сведения см. в разделе HTTP Strict Transport Security Protocol.

Добавить шаблонный код Identity в проект MVC с авторизацией

Запустите Identity генератор шаблонов, выполнив следующие действия.

  1. В Обозреватель решений щелкните проект правой кнопкой мыши и выберите Add>New Scaffolded Item.

  2. В левой области диалогового окна "Добавить новый шаблонный элемент" выберите Identity.

  3. В центральной области выберите Identityи нажмите кнопку "Добавить".

  4. В диалоговом окне "Добавить" Identity выберите нужные параметры:

    1. Если у вас уже есть настроенная страница макета для Identity (_Layout.cshtml), выберите существующую страницу, чтобы генератор шаблонного кода не перезаписал ваш макет некорректной разметкой. Например, выберите один из следующих вариантов:

      • Pages/Shared/_Layout.cshtml для Razor Pages или Blazor Server проектов с существующей инфраструктурой Razor Pages.
      • Views/Shared/_Layout.cshtml для проектов MVC или Blazor Server проектов с существующей инфраструктурой MVC.
    2. Выберите значок плюса (+) и добавьте класс контекста базы данных , класс DbContext. Чтобы добавить контекст данных, необходимо выбрать хотя бы один файл.

      • Чтобы создать контекст данных, выберите значок плюса (+). Примите значение по умолчанию или укажите класс (например, Contoso.Data.ApplicationDbContext для компании с именем Contoso).

      • Чтобы создать новый класс пользователя, выберите значок плюса (+) для класса User и укажите класс (например, ContosoUser для компании с именем Contoso).

    3. Выберите Add, чтобы запустить генератор каркаса.

Добавьте шаблон Identity в Blazor серверное приложение без существующей авторизации

Запустите Identity генератор шаблонов, выполнив следующие действия.

  1. В Обозреватель решений щелкните проект правой кнопкой мыши и выберите Add>New Scaffolded Item.

  2. В левой области диалогового окна "Добавить новый шаблонный элемент" выберите Identity.

  3. В центральной области выберите Identityи нажмите кнопку "Добавить".

  4. В диалоговом окне "Добавить" Identity выберите нужные параметры:

    1. Если у вас уже есть существующая настроенная страница макета для Identity (_Layout.cshtml), выберите эту существующую страницу, чтобы генератор шаблонного кода не перезаписал ваш макет неправильной разметкой. Например, выберите один из следующих вариантов:

      • Pages/Shared/_Layout.cshtml для страниц Razor или проектов Blazor Server с существующей инфраструктурой страниц Razor.
      • Views/Shared/_Layout.cshtml для проектов MVC или Blazor Server проектов с существующей инфраструктурой MVC.
    2. Выберите значок плюса (+) и добавьте класс контекста базы данных , класс DbContext. Чтобы добавить контекст данных, необходимо выбрать хотя бы один файл.

      • Чтобы создать контекст данных, выберите значок плюса (+). Примите значение по умолчанию или укажите новый класс для Identity.

      • Чтобы создать новый класс пользователя, выберите значок плюса (+) для класса User и укажите класс (например, ContosoUser для компании с именем Contoso).

    3. Выберите Добавить, чтобы запустить генератор шаблонов.

Identity настраивается в Areas/Identity/IdentityHostingStartup.cs. Дополнительные сведения см. в разделе IHostingStartup.

Миграции

Для сгенерированного кода для базы данных Identity требуется Entity Framework Core Migrations. Если миграция для создания Identity схемы еще не создана и применена к базе данных, используйте следующие процедуры для создания миграции и обновления базы данных.

Подключенные службы Visual Studio используются для добавления миграции EF Core и обновления базы данных.

  1. В Обозревателе решений дважды щелкните Подключенные службы.

  2. В области SQL Server Express LocalDB раздела Service Dependencies выберите Дополнительные действия (...) >Добавить миграцию.

  3. Дайте миграции имя миграции, например CreateIdentitySchema, то есть имя, описывающее миграцию.

    Дождитесь, пока контекст базы данных загрузится в поле с именами классов DbContext. Действие может занять несколько секунд.

  4. Нажмите кнопку "Готово ", чтобы завершить обновление. После завершения операции нажмите кнопку "Закрыть".

  5. Выбор дополнительных действий (...) >Обновление базы данных.

    Откроется диалоговое окно Обновление базы данных с помощью последней миграции.

    Дождитесь обновления поля имен классов DbContext и загрузки предыдущих миграций. Действие может занять несколько секунд.

  6. Нажмите кнопку "Готово ", чтобы завершить обновление. После завершения операции нажмите кнопку "Закрыть".

Команда update database выполняет миграции методов Up, которые ещё не были применены и содержатся в файле кода миграции, созданном с помощью генератора шаблонов. В этом случае команда запускает Up метод в файле Migrations/{TIME STAMP}_{MIGRATION NAME}.cs , который создает Identity таблицы, ограничения и индексы. Заполнитель {TIME STAMP} — метка времени, а заполнитель {MIGRATION NAME} — имя миграции.

Identity Если схема создана, но не применяется к базе данных, необходимо выполнить команду, чтобы обновить базу данных:

  1. В Обозревателе решений дважды щелкните Подключенные службы.

  2. В разделе SQL Server Express LocalDB в Service Dependencies выберите Дополнительные действия (...) >Обновить базу данных.

    Откроется диалоговое окно Обновление базы данных с помощью последней миграции.

    Дождитесь обновления поля имен классов DbContext и загрузки предыдущих миграций. Действие может занять несколько секунд.

  3. Нажмите кнопку "Готово ", чтобы завершить обновление. После завершения операции нажмите кнопку "Закрыть".

Вы можете подтвердить приложение схемы с помощью следующей Identity команды. Вывод команды содержит столбец applied, который показывает, какие миграции применены к базе данных.

В консоли Visual Studio диспетчер пакетов выполните команду Get-Migration:

Get-Migration

Если существует несколько контекстов базы данных, укажите контекст с параметром -Context .

Эндпоинты аутентификации Style

Так как серверные Blazor приложения используют Razor страницы Pages Identity , стилизация пользовательского интерфейса изменяется при переходе посетителя между Identity страницами и компонентами. У вас есть два варианта, чтобы решить проблему несогласованных стилей:

Пользовательские Identity компоненты

Подход к использованию компонентов Identity вместо страниц состоит в создании компонентов Identity. Так как SignInManager и UserManager не поддерживаются в Razor компонентах, используйте конечные точки веб-API в Blazor приложении для обработки действий учетной записи пользователя.

Используйте пользовательский макет со стилями приложения Blazor

Макет Identity и стили страниц можно изменить для создания страниц, использующих стили, аналогичные теме по умолчанию Blazor . Этот подход не рассматривается в документации.

Создать шаблон Identity для серверного Blazor приложения с авторизацией

Запустите Identity генератор, выполнив следующие действия.

  1. В Обозреватель решений щелкните проект правой кнопкой мыши и выберите Add>New Scaffolded Item.

  2. В левой области диалогового окна "Добавить новый шаблонный элемент" выберите Identity.

  3. В центральной области выберите Identityи нажмите кнопку "Добавить".

  4. В диалоговом окне "Добавить" Identity выберите нужные параметры:

    1. Если у вас уже есть существующая настраиваемая страница макета для Identity (_Layout.cshtml), выберите эту существующую страницу, чтобы генератор шаблонов не перезаписал ваш макет некорректной разметкой. Например, выберите один из следующих вариантов:

      • Pages/Shared/_Layout.cshtml для страниц Razor или проектов Blazor Server с существующей инфраструктурой страниц Razor.
      • Views/Shared/_Layout.cshtml для проектов MVC или проектов Blazor Server с существующей инфраструктурой MVC.
    2. Выберите значок плюса (+) и добавьте класс контекста базы данных , класс DbContext. Чтобы добавить контекст данных, необходимо выбрать хотя бы один файл.

      • Чтобы создать контекст данных, выберите значок плюса (+). Примите значение по умолчанию или укажите класс (например, Contoso.Data.ApplicationDbContext для компании с именем Contoso).

      • Чтобы создать новый класс пользователя, выберите значок плюса (+) для класса User и укажите класс (например, ContosoUser для компании с именем Contoso).

    3. Выберите Добавить, чтобы запустить генератор каркаса.

Некоторые Identity параметры настроены в Areas/Identity/IdentityHostingStartup.cs. Дополнительные сведения см. в разделе IHostingStartup.

Клиентские Blazor приложения

Клиентские Blazor приложения используют собственные Identity подходы пользовательского интерфейса и не могут использовать шаблон ASP.NET Core Identity . Серверные приложения ASP.NET Core для размещённых Blazor решений могут следовать рекомендациям Razor по Pages/MVC, приведённым в этой статье, и настраиваются так же, как и любой другой тип приложений ASP.NET Core, поддерживающих Identity.

Платформа Blazor не включает Razor версии компонентов страниц пользовательского Identity интерфейса. Identity Компоненты пользовательского интерфейса Razor можно создавать или получать из неподдерживаемых сторонних источников.

Дополнительные сведения см. в Blazor статье «Безопасность» и Identity других статьях.

Создайте полный исходный код Identity пользовательского интерфейса

Чтобы обеспечить полный контроль пользовательского Identity интерфейса, запустите Identity шаблон и выберите "Переопределить все файлы".

В следующем выделенном коде показаны изменения для замены пользовательского интерфейса Identity по умолчанию Identity в веб-приложении ASP.NET Core 2.1. Вы можете сделать это, чтобы иметь полный контроль над пользовательским интерфейсом Identity .

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity<IdentityUser, IdentityRole>()
        // services.AddDefaultIdentity<IdentityUser>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddMvc()
        .AddRazorPagesOptions(options =>
        {
            options.Conventions.AuthorizeAreaFolder("Identity", "/Account/Manage");
            options.Conventions.AuthorizeAreaPage("Identity", "/Account/Logout");
        });

    services.ConfigureApplicationCookie(options =>
    {
        options.LoginPath = $"/Identity/Account/Login";
        options.LogoutPath = $"/Identity/Account/Logout";
        options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
    });

    // using Microsoft.AspNetCore.Identity.UI.Services;
    services.AddSingleton<IEmailSender, EmailSender>();
}

Значение по умолчанию Identity заменяется в следующем коде:

services.AddIdentity<IdentityUser, IdentityRole>()
    // services.AddDefaultIdentity<IdentityUser>()
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders();

Следующий код задает значения LoginPath, LogoutPath и AccessDeniedPath):

services.ConfigureApplicationCookie(options =>
{
    options.LoginPath = $"/Identity/Account/Login";
    options.LogoutPath = $"/Identity/Account/Logout";
    options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
});

Зарегистрируйте реализацию IEmailSender , например:

// using Microsoft.AspNetCore.Identity.UI.Services;
services.AddSingleton<IEmailSender, EmailSender>();
public class EmailSender : IEmailSender
{
    public Task SendEmailAsync(string email, string subject, string message)
    {
        return Task.CompletedTask;
    }
}

Настройка пароля

Если PasswordOptions настроены в Startup.ConfigureServices, для свойства [StringLength] на страницах , созданных с помощью генерации шаблонов, может потребоваться настройка атрибута Password. InputModel Password свойства находятся в следующих файлах:

  • Areas/Identity/Pages/Account/Register.cshtml.cs
  • Areas/Identity/Pages/Account/ResetPassword.cshtml.cs

Отключение страницы

В этом разделе показано, как отключить страницу регистрации, но этот подход можно использовать для отключения любой страницы.

Чтобы отключить регистрацию пользователей, выполните приведенные действия.

  • Каркас Identity. Включите Account.Register, Account.Login и Account.RegisterConfirmation. Например:

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  • Обновите Areas/Identity/Pages/Account/Register.cshtml.cs, чтобы пользователи не могли регистрироваться через эту конечную точку:

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • Обновление Areas/Identity/Pages/Account/Register.cshtml для согласованности с предыдущими изменениями:

    @page
    @model RegisterModel
    @{
        ViewData["Title"] = "Go to Login";
    }
    
    <h1>@ViewData["Title"]</h1>
    
    <li class="nav-item">
        <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
    </li>
    
  • Закомментируйте или удалите ссылку регистрации из Areas/Identity/Pages/Account/Login.cshtml

    @*
    <p>
        <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
    </p>
    *@
    
  • Обновите страницу Areas/Identity/Pages/Account/RegisterConfirmation .

    • Удалите код и ссылки из cshtml-файла.
    • Удалите код подтверждения из :PageModel
    [AllowAnonymous]
      public class RegisterConfirmationModel : PageModel
      {
          public IActionResult OnGet()
          {  
              return Page();
          }
      }
    

Добавление пользователей с помощью другого приложения

Предоставьте механизм добавления пользователей за пределами веб-приложения. Возможные варианты добавления пользователей:

  • Выделенное веб-приложение администратора.
  • Консольное приложение.

Следующий код описывает один подход к добавлению пользователей:

  • Список пользователей считывается в память.
  • Для каждого пользователя создается надежный уникальный пароль.
  • Пользователь добавляется в Identity базу данных.
  • Пользователь уведомляется и сообщает об изменении пароля.
public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();

        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;

            try
            {
                var context = services.GetRequiredService<AppDbCntx>();
                context.Database.Migrate();

                var config = host.Services.GetRequiredService<IConfiguration>();
                var userList = config.GetSection("userList").Get<List<string>>();

                SeedData.Initialize(services, userList).Wait();
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occurred adding users.");
            }
        }

        host.Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

Следующий код описывает добавление пользователя:


public static async Task Initialize(IServiceProvider serviceProvider,
                                    List<string> userList)
{
    var userManager = serviceProvider.GetService<UserManager<IdentityUser>>();

    foreach (var userName in userList)
    {
        var userPassword = GenerateSecurePassword();
        var userId = await EnsureUser(userManager, userName, userPassword);

        NotifyUser(userName, userPassword);
    }
}

private static async Task<string> EnsureUser(UserManager<IdentityUser> userManager,
                                             string userName, string userPassword)
{
    var user = await userManager.FindByNameAsync(userName);

    if (user == null)
    {
        user = new IdentityUser(userName)
        {
            EmailConfirmed = true
        };
        await userManager.CreateAsync(user, userPassword);
    }

    return user.Id;
}

Аналогичный подход можно использовать для рабочих сценариев.

Запретить публикацию статических Identity ресурсов

Сведения о предотвращении публикации статических Identity ресурсов в корневом каталоге веб-сайта см. в статье "Введение Identity в ASP.NET Core".

Дополнительные ресурсы

Изменения кода проверки подлинности на ASP.NET Core 2.1 или более поздней версии