формирование шаблонов Identity в ASP.NET Core проектах

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

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

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

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

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

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

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

Формирование шаблонов Identity в Razor проекте без существующей авторизации

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

в консоли диспетчер пакетовVisual Studio:

Install-Package Microsoft.VisualStudio.Web.CodeGeneration.Design

Запустите программу Identity формирования шаблонов:

  • В Обозреватель решенийщелкните правой кнопкой мыши проект добавитьНовыйшаблонный элемент.
  • В левой области диалогового окна Добавление нового шаблона элемента выберите >>.
  • В диалоговом окне Добавить выберите нужные параметры.
    • Выберите существующую страницу макета, или файл макета будет перезаписан с неверной разметкой:
      • ~/Pages/Shared/_Layout.cshtml для Razor страниц
      • ~/Views/Shared/_Layout.cshtml для проектов MVC
      • Blazor Серверные приложения, созданные на основе Blazor шаблона сервера ( blazorserver ) Razor , по умолчанию не настроены для страниц или MVC. Оставьте запись страницы макета пустой.
    • Нажмите + кнопку, чтобы создать новый +. Примите значение по умолчанию или укажите класс (например, MyApplication.Data.ApplicationDbContext ).
  • Выберите Добавить.

Миграция, Усеаусентикатион и макет

Для созданного Identity кода базы данных требуется Identity. Создайте миграцию и обновите базу данных. Например, выполните следующие команды:

в консоли диспетчер пакетовVisual Studio:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

IdentityПараметр имени "CREATE SCHEMA" для Add-Migration команды является произвольным. "CreateIdentitySchema" Описывает миграцию.

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

Необязательно: Добавьте в файл макета имя для входа partial ( _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.min.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.min.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.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 :

в консоли диспетчер пакетовVisual Studio:

Install-Package Microsoft.VisualStudio.Web.CodeGeneration.Design

Запустите программу Identity формирования шаблонов:

  • В Обозреватель решенийщелкните правой кнопкой мыши проект добавитьНовыйшаблонный элемент.
  • В левой области диалогового окна Добавление нового шаблона элемента выберите . Выберите Identity в центральной области. Нажмите кнопку Добавить.
  • В диалоговом окне Добавить выберите нужные параметры.
    • Выберите существующую страницу макета, чтобы файл макета не перезаписывался неверной разметкой. При выборе существующего _Layout.cshtml файла он _Layout.cshtml перезаписывается. Например:
      • ~/Pages/Shared/_Layout.cshtml для Razor страниц или Blazor серверных проектов с Razor инфраструктурой существующих страниц.
      • ~/Views/Shared/_Layout.cshtml для проектов MVC или Blazor серверных проектов с существующей инфраструктурой MVC.
  • Чтобы использовать существующий контекст данных, выберите по меньшей мере один файл для переопределения. Необходимо выбрать по крайней мере один файл для добавления контекста данных.
    • Выберите класс контекста данных.
    • Выберите Добавить.
  • Чтобы создать новый контекст пользователя и, возможно, создать настраиваемый класс пользователя для Identity :
    • Нажмите + кнопку, чтобы создать новый +. Примите значение по умолчанию или укажите класс (например, MyApplication.Data.ApplicationDbContext ).
    • Выберите Добавить.

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

Запустите программу Identity формирования шаблонов:

  • В Обозреватель решенийщелкните правой кнопкой мыши проект добавитьНовыйшаблонный элемент.
  • В левой области диалогового окна Добавление шаблона выберите >>.
  • В диалоговом окне Добавить выберите нужные параметры.
    • Выберите существующую страницу макета, чтобы файл макета не перезаписывался неверной разметкой. При выборе существующего файла _layout. cshtml он не перезаписывается. Например:
      • ~/Pages/Shared/_Layout.cshtml для Razor страниц или Blazor серверных проектов с Razor инфраструктурой существующих страниц
      • ~/Views/Shared/_Layout.cshtml для проектов MVC или Blazor серверных проектов с существующей инфраструктурой MVC
  • Чтобы использовать существующий контекст данных, выберите по меньшей мере один файл для переопределения. Необходимо выбрать по крайней мере один файл для добавления контекста данных.
    • Выберите класс контекста данных.
    • Выберите Добавить.
  • Чтобы создать новый контекст пользователя и, возможно, создать настраиваемый класс пользователя для Identity :
    • Нажмите + кнопку, чтобы создать новый +. Примите значение по умолчанию или укажите класс (например, MyApplication.Data.ApplicationDbContext ).
    • Выберите Добавить.

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

Формирование шаблонов Identity в проекте MVC без существующей авторизации

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

в консоли диспетчер пакетовVisual Studio:

Install-Package Microsoft.VisualStudio.Web.CodeGeneration.Design

Запустите программу Identity формирования шаблонов:

  • В Обозреватель решенийщелкните правой кнопкой мыши проект добавитьНовыйшаблонный элемент.
  • В левой области диалогового окна Добавление нового шаблона элемента выберите >>.
  • В диалоговом окне Добавить выберите нужные параметры.
    • Выберите существующую страницу макета, или файл макета будет перезаписан с неверной разметкой:
      • ~/Pages/Shared/_Layout.cshtml для Razor страниц
      • ~/Views/Shared/_Layout.cshtml для проектов MVC
      • Blazor Серверные приложения, созданные на основе Blazor шаблона сервера ( blazorserver ) Razor , по умолчанию не настроены для страниц или MVC. Оставьте запись страницы макета пустой.
    • Нажмите + кнопку, чтобы создать новый +. Примите значение по умолчанию или укажите класс (например, MyApplication.Data.ApplicationDbContext ).
  • Выберите Добавить.

Необязательно: Добавьте часть имени для входа partial ( _LoginPartial ) в файл _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.min.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.min.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

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

Для созданного Identity кода базы данных требуется Identity. Создайте миграцию и обновите базу данных. Например, выполните следующие команды:

в консоли диспетчер пакетовVisual Studio:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

IdentityПараметр имени "CREATE SCHEMA" для Add-Migration команды является произвольным. "CreateIdentitySchema" Описывает миграцию.

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

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 :

в консоли диспетчер пакетовVisual Studio:

Install-Package Microsoft.VisualStudio.Web.CodeGeneration.Design

Запустите программу Identity формирования шаблонов:

  • В Обозреватель решенийщелкните правой кнопкой мыши проект добавитьНовыйшаблонный элемент.
  • В левой области диалогового окна Добавление нового шаблона элемента выберите . Выберите Identity в центральной области. Нажмите кнопку Добавить.
  • В диалоговом окне Добавить выберите нужные параметры.
    • Выберите существующую страницу макета, чтобы файл макета не перезаписывался неверной разметкой. При выборе существующего _Layout.cshtml файла он _Layout.cshtml перезаписывается. Например:
      • ~/Pages/Shared/_Layout.cshtml для Razor страниц или Blazor серверных проектов с Razor инфраструктурой существующих страниц.
      • ~/Views/Shared/_Layout.cshtml для проектов MVC или Blazor серверных проектов с существующей инфраструктурой MVC.
  • Чтобы использовать существующий контекст данных, выберите по меньшей мере один файл для переопределения. Необходимо выбрать по крайней мере один файл для добавления контекста данных.
    • Выберите класс контекста данных.
    • Выберите Добавить.
  • Чтобы создать новый контекст пользователя и, возможно, создать настраиваемый класс пользователя для Identity :
    • Нажмите + кнопку, чтобы создать новый +. Примите значение по умолчанию или укажите класс (например, MyApplication.Data.ApplicationDbContext ).
    • Выберите Добавить.

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

Запустите программу Identity формирования шаблонов:

  • В Обозреватель решенийщелкните правой кнопкой мыши проект добавитьНовыйшаблонный элемент.
  • В левой области диалогового окна Добавление шаблона выберите >>.
  • В диалоговом окне Добавить выберите нужные параметры.
    • Выберите существующую страницу макета, чтобы файл макета не перезаписывался неверной разметкой. При выборе существующего файла _layout. cshtml он не перезаписывается. Например:
      • ~/Pages/Shared/_Layout.cshtml для Razor страниц или Blazor серверных проектов с Razor инфраструктурой существующих страниц
      • ~/Views/Shared/_Layout.cshtml для проектов MVC или Blazor серверных проектов с существующей инфраструктурой MVC
  • Чтобы использовать существующий контекст данных, выберите по меньшей мере один файл для переопределения. Необходимо выбрать по крайней мере один файл для добавления контекста данных.
    • Выберите класс контекста данных.
    • Выберите Добавить.
  • Чтобы создать новый контекст пользователя и, возможно, создать настраиваемый класс пользователя для Identity :
    • Нажмите + кнопку, чтобы создать новый +. Примите значение по умолчанию или укажите класс (например, MyApplication.Data.ApplicationDbContext ).
    • Выберите Добавить.

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

Формирование шаблонов Identity в Blazor серверный проект

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

в консоли диспетчер пакетовVisual Studio:

Install-Package Microsoft.VisualStudio.Web.CodeGeneration.Design

Запустите программу Identity формирования шаблонов:

  • В Обозреватель решенийщелкните правой кнопкой мыши проект добавитьНовыйшаблонный элемент.
  • В левой области диалогового окна Добавление нового шаблона элемента выберите . Выберите Identity в центральной области. Нажмите кнопку Добавить.
  • В диалоговом окне Добавить выберите нужные параметры.
    • Выберите существующую страницу макета, чтобы файл макета не перезаписывался неверной разметкой. При выборе существующего _Layout.cshtml файла он _Layout.cshtml перезаписывается. Например:
      • ~/Pages/Shared/_Layout.cshtml для Razor страниц или Blazor серверных проектов с Razor инфраструктурой существующих страниц.
      • ~/Views/Shared/_Layout.cshtml для проектов MVC или Blazor серверных проектов с существующей инфраструктурой MVC.
  • Чтобы использовать существующий контекст данных, выберите по меньшей мере один файл для переопределения. Необходимо выбрать по крайней мере один файл для добавления контекста данных.
    • Выберите класс контекста данных.
    • Выберите Добавить.
  • Чтобы создать новый контекст пользователя и, возможно, создать настраиваемый класс пользователя для Identity :
    • Нажмите + кнопку, чтобы создать новый +. Примите значение по умолчанию или укажите класс (например, MyApplication.Data.ApplicationDbContext ).
    • Выберите Добавить.

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

Запустите программу Identity формирования шаблонов:

  • В Обозреватель решенийщелкните правой кнопкой мыши проект добавитьНовыйшаблонный элемент.
  • В левой области диалогового окна Добавление шаблона выберите >>.
  • В диалоговом окне Добавить выберите нужные параметры.
    • Выберите существующую страницу макета, чтобы файл макета не перезаписывался неверной разметкой. При выборе существующего файла _layout. cshtml он не перезаписывается. Например:
      • ~/Pages/Shared/_Layout.cshtml для Razor страниц или Blazor серверных проектов с Razor инфраструктурой существующих страниц
      • ~/Views/Shared/_Layout.cshtml для проектов MVC или Blazor серверных проектов с существующей инфраструктурой MVC
  • Чтобы использовать существующий контекст данных, выберите по меньшей мере один файл для переопределения. Необходимо выбрать по крайней мере один файл для добавления контекста данных.
    • Выберите класс контекста данных.
    • Выберите Добавить.
  • Чтобы создать новый контекст пользователя и, возможно, создать настраиваемый класс пользователя для Identity :
    • Нажмите + кнопку, чтобы создать новый +. Примите значение по умолчанию или укажите класс (например, MyApplication.Data.ApplicationDbContext ).
    • Выберите Добавить.

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

Миграции

Для созданного Identity кода базы данных требуется Identity. Создайте миграцию и обновите базу данных. Например, выполните следующие команды:

в консоли диспетчер пакетовVisual Studio:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

IdentityПараметр имени "CREATE SCHEMA" для Add-Migration команды является произвольным. "CreateIdentitySchema" Описывает миграцию.

Передача токена XSRF в приложение

Маркеры можно передавать в компоненты:

  • Когда маркеры проверки подлинности подготавливаются и сохраняются в процессе проверки подлинности cookie , они могут передаваться в компоненты.
  • Razor компоненты не могут использовать HttpContext напрямую, поэтому не существует способа получить Razor для размещения Identity конечной точки выхода в /Identity/Account/Logout . Токен XSRF может быть передан компонентам.

Для получения дополнительной информации см. ASP.NET Core Blazor Server additional security scenarios.

В Pages/_Host.cshtml файле установите маркер после его добавления в InitialApplicationStateTokenProvider классы и:

@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf

...

var tokens = new InitialApplicationState
{
    ...

    XsrfToken = Xsrf.GetAndStoreTokens(HttpContext).RequestToken
};

Обновите App компонент ( App.razor ), чтобы назначить InitialState.XsrfToken :

@inject TokenProvider TokenProvider

...

TokenProvider.XsrfToken = InitialState.XsrfToken;

TokenProviderСлужба, показанная в разделе, используется в LoginDisplay компоненте в следующем разделе TokenProvider .

Регистрация службы поставщика маркеров

При использовании службы поставщика маркеровЗарегистрируйте службу в :

builder.Services.AddScoped<TokenProvider>();

Изменения в потоке макета и проверки подлинности

Добавьте RedirectToLogin компонент ( RedirectToLogin.razor ) в папку приложения Shared в корневом каталоге проекта:

@inject NavigationManager Navigation
@code {
    protected override void OnInitialized()
    {
        Navigation.NavigateTo("Identity/Account/Login?returnUrl=" +
            Uri.EscapeDataString(Navigation.Uri), true);
    }
}

Добавьте LoginDisplay компонент ( LoginDisplay.razor ) в Shared папку приложения. В следующем примере служба поставщика маркеров предоставляет маркер XSRF для HTML-формы, которая отправляет в Identity конечную точку выхода.

@using Microsoft.AspNetCore.Components.Authorization
@inject NavigationManager Navigation
@inject TokenProvider TokenProvider

<AuthorizeView>
    <Authorized>
        <a href="Identity/Account/Manage/Index">
            Hello, @context.User.Identity.Name!
        </a>
        <form action="/Identity/Account/Logout?returnUrl=%2F" method="post">
            <button class="nav-link btn btn-link" type="submit">Logout</button>
            <input name="__RequestVerificationToken" type="hidden" 
                value="@TokenProvider.XsrfToken">
        </form>
    </Authorized>
    <NotAuthorized>
        <a href="Identity/Account/Register">Register</a>
        <a href="Identity/Account/Login">Login</a>
    </NotAuthorized>
</AuthorizeView>

В MainLayout компоненте ( Shared/MainLayout.razor ) добавьте LoginDisplay компонент в <div> содержимое элемента верхней строки:

<div class="top-row px-4 auth">
    <LoginDisplay />
    <a href="https://docs.microsoft.com/aspnet/" target="_blank">About</a>
</div>

Конечные точки проверки подлинности стиля

Поскольку Blazor сервер использует RazorIdentity страницы страниц, стиль пользовательского интерфейса изменяется при переходе посетителя между Identity страницами и компонентами. Существует два варианта для адресации стилей инконгруаус:

IdentityКомпоненты сборки

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

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

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

Примечание

Пример в этом разделе является просто начальной точкой для настройки. Для лучшего взаимодействия с пользователем, скорее всего, потребуется дополнительная работа.

Создайте новый NavMenu_IdentityLayout компонент ( Shared/NavMenu_IdentityLayout.razor ). Для разметки и кода компонента используйте то же содержимое NavMenu компонента приложения ( Shared/NavMenu.razor ). Вывлекайте все NavLink компоненты, которые не могут быть анонимно подключены, так как автоматическое перенаправление в RedirectToLogin компоненте не выполняется для компонентов, нуждающихся в проверке подлинности или авторизации.

В Pages/Shared/Layout.cshtml файле внесите следующие изменения:

  • Добавьте Razor директивы в начало файла, чтобы использовать вспомогательные функции тегов и компоненты приложения в Shared папке:

    @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
    @using {APPLICATION ASSEMBLY}.Shared
    

    Замените {APPLICATION ASSEMBLY} на имя сборки приложения.

  • Добавьте <base> тег и Blazor таблицу стилей <link> к <head> содержимому:

    <base href="~/" />
    <link rel="stylesheet" href="~/css/site.css" />
    
  • Измените содержимое <body> тега следующим образом:

    <div class="sidebar" style="float:left">
        <component type="typeof(NavMenu_IdentityLayout)" 
            render-mode="ServerPrerendered" />
    </div>
    
    <div class="main" style="padding-left:250px">
        <div class="top-row px-4">
            @{
                var result = Engine.FindView(ViewContext, "_LoginPartial", 
                    isMainPage: false);
            }
            @if (result.Success)
            {
                await Html.RenderPartialAsync("_LoginPartial");
            }
            else
            {
                throw new InvalidOperationException("The default Identity UI " +
                    "layout requires a partial view '_LoginPartial'.");
            }
            <a href="https://docs.microsoft.com/aspnet/" target="_blank">About</a>
        </div>
    
        <div class="content px-4">
            @RenderBody()
        </div>
    </div>
    
    <script src="~/Identity/lib/jquery/dist/jquery.min.js"></script>
    <script src="~/Identity/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
    <script src="~/Identity/js/site.js" asp-append-version="true"></script>
    @RenderSection("Scripts", required: false)
    <script src="_framework/blazor.server.js"></script>
    

Автономные или размещенные приложения веб – Blazor сборки

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

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

Более подробную информацию см. в разделе Blazor Security and Identity articles.

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

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

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

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

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

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

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

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

  • Шаблон Identity . Включить учетную запись. регистрация, учетная запись. Login и Account. Регистерконфирматион. Например:

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  • Обновите области или /Пажес/аккаунт/регистер.кштмл.КС , чтобы пользователи не могли зарегистрироваться из этой конечной точки:

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • Обновите области/ /Пажес/аккаунт/регистер.кштмл , чтобы они соответствовали предыдущим изменениям:

    @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>
    
  • Закомментируйте или удалите регистрационную ссылку из областей/ /Пажес/аккаунт/логин.кштмл

    @*
    <p>
        <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
    </p>
    *@
    
  • Обновите страницу области или /Пажес/аккаунт/регистерконфирматион .

    • Удалите код и ссылки из файла 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 ресурсов в веб-корне, см Introduction to Identity on ASP.NET Core . раздел.

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

Приложения, которые не включают проверку подлинности, могут применять механизм формирования шаблонов для добавления пакета РКЛ. Вы можете выбрать, какой код 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();
}

Предыдущий код записывает в комментарий код, который дублируется в области/ /Identity хостингстартуп. cs.

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

Формирование шаблона Identity в пустой проект

Запустите программу Identity формирования шаблонов:

  • В Обозреватель решенийщелкните правой кнопкой мыши проект добавитьНовыйшаблонный элемент.
  • В левой области диалогового окна Добавление нового шаблона элемента выберите >>.
  • В диалоговом окне Добавить выберите нужные параметры.
    • Выберите существующую страницу макета, или файл макета будет перезаписан с неверной разметкой:
      • ~/Pages/Shared/_Layout.cshtml для Razor страниц
      • ~/Views/Shared/_Layout.cshtml для проектов MVC
      • Blazor Серверные приложения, созданные на основе Blazor шаблона сервера ( blazorserver ) Razor , по умолчанию не настроены для страниц или MVC. Оставьте запись страницы макета пустой.
    • Нажмите + кнопку, чтобы создать новый +. Примите значение по умолчанию или укажите класс (например, MyApplication.Data.ApplicationDbContext ).
  • Выберите Добавить.

Обновите 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-протокол безопасности транспорта.

Для созданного Identity кода базы данных требуется Identity. Создайте миграцию и обновите базу данных. Например, выполните следующие команды:

в консоли диспетчер пакетовVisual Studio:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

IdentityПараметр имени "CREATE SCHEMA" для Add-Migration команды является произвольным. "CreateIdentitySchema" Описывает миграцию.

Формирование шаблонов Identity в Razor проекте без существующей авторизации

Запустите программу Identity формирования шаблонов:

  • В Обозреватель решенийщелкните правой кнопкой мыши проект добавитьНовыйшаблонный элемент.
  • В левой области диалогового окна Добавление нового шаблона элемента выберите >>.
  • В диалоговом окне Добавить выберите нужные параметры.
    • Выберите существующую страницу макета, или файл макета будет перезаписан с неверной разметкой:
      • ~/Pages/Shared/_Layout.cshtml для Razor страниц
      • ~/Views/Shared/_Layout.cshtml для проектов MVC
      • Blazor Серверные приложения, созданные на основе Blazor шаблона сервера ( blazorserver ) Razor , по умолчанию не настроены для страниц или MVC. Оставьте запись страницы макета пустой.
    • Нажмите + кнопку, чтобы создать новый +. Примите значение по умолчанию или укажите класс (например, MyApplication.Data.ApplicationDbContext ).
  • Выберите Добавить.

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

Миграция, Усеаусентикатион и макет

Для созданного Identity кода базы данных требуется Identity. Создайте миграцию и обновите базу данных. Например, выполните следующие команды:

в консоли диспетчер пакетовVisual Studio:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

IdentityПараметр имени "CREATE SCHEMA" для Add-Migration команды является произвольным. "CreateIdentitySchema" Описывает миграцию.

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

Обновите 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-протокол безопасности транспорта.

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

Необязательно: Добавьте в файл макета имя для входа partial ( _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.min.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.min.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

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

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

Запустите программу Identity формирования шаблонов:

  • В Обозреватель решенийщелкните правой кнопкой мыши проект добавитьНовыйшаблонный элемент.
  • В левой области диалогового окна Добавление нового шаблона элемента выберите . Выберите Identity в центральной области. Нажмите кнопку Добавить.
  • В диалоговом окне Добавить выберите нужные параметры.
    • Выберите существующую страницу макета, чтобы файл макета не перезаписывался неверной разметкой. При выборе существующего _Layout.cshtml файла он _Layout.cshtml перезаписывается. Например:
      • ~/Pages/Shared/_Layout.cshtml для Razor страниц или Blazor серверных проектов с Razor инфраструктурой существующих страниц.
      • ~/Views/Shared/_Layout.cshtml для проектов MVC или Blazor серверных проектов с существующей инфраструктурой MVC.
  • Чтобы использовать существующий контекст данных, выберите по меньшей мере один файл для переопределения. Необходимо выбрать по крайней мере один файл для добавления контекста данных.
    • Выберите класс контекста данных.
    • Выберите Добавить.
  • Чтобы создать новый контекст пользователя и, возможно, создать настраиваемый класс пользователя для Identity :
    • Нажмите + кнопку, чтобы создать новый +. Примите значение по умолчанию или укажите класс (например, MyApplication.Data.ApplicationDbContext ).
    • Выберите Добавить.

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

Запустите программу Identity формирования шаблонов:

  • В Обозреватель решенийщелкните правой кнопкой мыши проект добавитьНовыйшаблонный элемент.
  • В левой области диалогового окна Добавление шаблона выберите >>.
  • В диалоговом окне Добавить выберите нужные параметры.
    • Выберите существующую страницу макета, чтобы файл макета не перезаписывался неверной разметкой. При выборе существующего файла _layout. cshtml он не перезаписывается. Например:
      • ~/Pages/Shared/_Layout.cshtml для Razor страниц или Blazor серверных проектов с Razor инфраструктурой существующих страниц
      • ~/Views/Shared/_Layout.cshtml для проектов MVC или Blazor серверных проектов с существующей инфраструктурой MVC
  • Чтобы использовать существующий контекст данных, выберите по меньшей мере один файл для переопределения. Необходимо выбрать по крайней мере один файл для добавления контекста данных.
    • Выберите класс контекста данных.
    • Выберите Добавить.
  • Чтобы создать новый контекст пользователя и, возможно, создать настраиваемый класс пользователя для Identity :
    • Нажмите + кнопку, чтобы создать новый +. Примите значение по умолчанию или укажите класс (например, MyApplication.Data.ApplicationDbContext ).
    • Выберите Добавить.

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

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

Формирование шаблонов Identity в проекте MVC без существующей авторизации

Запустите программу Identity формирования шаблонов:

  • В Обозреватель решенийщелкните правой кнопкой мыши проект добавитьНовыйшаблонный элемент.
  • В левой области диалогового окна Добавление нового шаблона элемента выберите >>.
  • В диалоговом окне Добавить выберите нужные параметры.
    • Выберите существующую страницу макета, или файл макета будет перезаписан с неверной разметкой:
      • ~/Pages/Shared/_Layout.cshtml для Razor страниц
      • ~/Views/Shared/_Layout.cshtml для проектов MVC
      • Blazor Серверные приложения, созданные на основе Blazor шаблона сервера ( blazorserver ) Razor , по умолчанию не настроены для страниц или MVC. Оставьте запись страницы макета пустой.
    • Нажмите + кнопку, чтобы создать новый +. Примите значение по умолчанию или укажите класс (например, MyApplication.Data.ApplicationDbContext ).
  • Выберите Добавить.

Необязательно: Добавьте часть имени для входа partial ( _LoginPartial ) в файл _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.min.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.min.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.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настраивается в Identity. Дополнительные сведения см. в разделе IHostingStartup.

Для созданного Identity кода базы данных требуется Identity. Создайте миграцию и обновите базу данных. Например, выполните следующие команды:

в консоли диспетчер пакетовVisual Studio:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

IdentityПараметр имени "CREATE SCHEMA" для Add-Migration команды является произвольным. "CreateIdentitySchema" Описывает миграцию.

Обновите 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-протокол безопасности транспорта.

Формирование шаблонов Identity в проекте MVC с авторизацией

Запустите программу Identity формирования шаблонов:

  • В Обозреватель решенийщелкните правой кнопкой мыши проект добавитьНовыйшаблонный элемент.
  • В левой области диалогового окна Добавление нового шаблона элемента выберите . Выберите Identity в центральной области. Нажмите кнопку Добавить.
  • В диалоговом окне Добавить выберите нужные параметры.
    • Выберите существующую страницу макета, чтобы файл макета не перезаписывался неверной разметкой. При выборе существующего _Layout.cshtml файла он _Layout.cshtml перезаписывается. Например:
      • ~/Pages/Shared/_Layout.cshtml для Razor страниц или Blazor серверных проектов с Razor инфраструктурой существующих страниц.
      • ~/Views/Shared/_Layout.cshtml для проектов MVC или Blazor серверных проектов с существующей инфраструктурой MVC.
  • Чтобы использовать существующий контекст данных, выберите по меньшей мере один файл для переопределения. Необходимо выбрать по крайней мере один файл для добавления контекста данных.
    • Выберите класс контекста данных.
    • Выберите Добавить.
  • Чтобы создать новый контекст пользователя и, возможно, создать настраиваемый класс пользователя для Identity :
    • Нажмите + кнопку, чтобы создать новый +. Примите значение по умолчанию или укажите класс (например, MyApplication.Data.ApplicationDbContext ).
    • Выберите Добавить.

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

Запустите программу Identity формирования шаблонов:

  • В Обозреватель решенийщелкните правой кнопкой мыши проект добавитьНовыйшаблонный элемент.
  • В левой области диалогового окна Добавление шаблона выберите >>.
  • В диалоговом окне Добавить выберите нужные параметры.
    • Выберите существующую страницу макета, чтобы файл макета не перезаписывался неверной разметкой. При выборе существующего файла _layout. cshtml он не перезаписывается. Например:
      • ~/Pages/Shared/_Layout.cshtml для Razor страниц или Blazor серверных проектов с Razor инфраструктурой существующих страниц
      • ~/Views/Shared/_Layout.cshtml для проектов MVC или Blazor серверных проектов с существующей инфраструктурой MVC
  • Чтобы использовать существующий контекст данных, выберите по меньшей мере один файл для переопределения. Необходимо выбрать по крайней мере один файл для добавления контекста данных.
    • Выберите класс контекста данных.
    • Выберите Добавить.
  • Чтобы создать новый контекст пользователя и, возможно, создать настраиваемый класс пользователя для Identity :
    • Нажмите + кнопку, чтобы создать новый +. Примите значение по умолчанию или укажите класс (например, MyApplication.Data.ApplicationDbContext ).
    • Выберите Добавить.

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

Формирование шаблонов Identity в Blazor серверном проекте без существующей авторизации

Запустите программу Identity формирования шаблонов:

  • В Обозреватель решенийщелкните правой кнопкой мыши проект добавитьНовыйшаблонный элемент.
  • В левой области диалогового окна Добавление нового шаблона элемента выберите >>.
  • В диалоговом окне Добавить выберите нужные параметры.
    • Выберите существующую страницу макета, или файл макета будет перезаписан с неверной разметкой:
      • ~/Pages/Shared/_Layout.cshtml для Razor страниц
      • ~/Views/Shared/_Layout.cshtml для проектов MVC
      • Blazor Серверные приложения, созданные на основе Blazor шаблона сервера ( blazorserver ) Razor , по умолчанию не настроены для страниц или MVC. Оставьте запись страницы макета пустой.
    • Нажмите + кнопку, чтобы создать новый +. Примите значение по умолчанию или укажите класс (например, MyApplication.Data.ApplicationDbContext ).
  • Выберите Добавить.

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

Миграции

Для созданного Identity кода базы данных требуется Identity. Создайте миграцию и обновите базу данных. Например, выполните следующие команды:

в консоли диспетчер пакетовVisual Studio:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

IdentityПараметр имени "CREATE SCHEMA" для Add-Migration команды является произвольным. "CreateIdentitySchema" Описывает миграцию.

Передача токена XSRF в приложение

Маркеры можно передавать в компоненты:

  • Когда маркеры проверки подлинности подготавливаются и сохраняются в процессе проверки подлинности cookie , они могут передаваться в компоненты.
  • Razor компоненты не могут использовать HttpContext напрямую, поэтому не существует способа получить Razor для размещения Identity конечной точки выхода в /Identity/Account/Logout . Токен XSRF может быть передан компонентам.

Для получения дополнительной информации см. ASP.NET Core Blazor Server additional security scenarios.

В файле pages/_Host. cshtml Установите маркер после его добавления в TokenProvider классы и:

@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf

...

var tokens = new InitialApplicationState
{
    ...

    XsrfToken = Xsrf.GetAndStoreTokens(HttpContext).RequestToken
};

Обновите App компонент (App), чтобы назначить InitialState.XsrfToken :

@inject TokenProvider TokenProvider

...

TokenProvider.XsrfToken = InitialState.XsrfToken;

TokenProviderСлужба, показанная в разделе, используется в LoginDisplay компоненте в следующем разделе TokenProvider .

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

В классе Startup сделайте следующее:

  • Убедитесь, что Razor службы страниц добавлены в Startup.ConfigureServices .
  • При использовании TokenProviderЗарегистрируйте службу.
  • Вызовите в UseDatabaseErrorPage построителе приложений в Startup.Configure среде разработки.
  • Вызовите UseAuthentication и UseAuthorization после UseRouting .
  • Добавление конечной точки для Razor страниц.
public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();
    services.AddServerSideBlazor();
    services.AddSingleton<WeatherForecastService>();
    services.AddScoped<TokenProvider>();
}

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();
        endpoints.MapBlazorHub();
        endpoints.MapFallbackToPage("/_Host");
    });
}

UseHsts рекомендуется, но не является обязательным. Дополнительные сведения см. в разделе http-протокол безопасности транспорта.

Изменения в потоке макета и проверки подлинности

Добавьте RedirectToLogin компонент (RedirectToLogin) в общую папку приложения в корневом каталоге проекта:

@inject NavigationManager Navigation
@code {
    protected override void OnInitialized()
    {
        Navigation.NavigateTo("Identity/Account/Login?returnUrl=" +
            Uri.EscapeDataString(Navigation.Uri), true);
    }
}

Добавьте LoginDisplay компонент (LoginDisplay) в общую папку приложения. Служба TokenProvider предоставляет маркер XSRF для HTML-формы, которая отправляет в конечную точку выхода.

@using Microsoft.AspNetCore.Components.Authorization
@inject NavigationManager Navigation
@inject TokenProvider TokenProvider

<AuthorizeView>
    <Authorized>
        <a href="Identity/Account/Manage/Index">
            Hello, @context.User.Identity.Name!
        </a>
        <form action="/Identity/Account/Logout?returnUrl=%2F" method="post">
            <button class="nav-link btn btn-link" type="submit">Logout</button>
            <input name="__RequestVerificationToken" type="hidden" 
                value="@TokenProvider.XsrfToken">
        </form>
    </Authorized>
    <NotAuthorized>
        <a href="Identity/Account/Register">Register</a>
        <a href="Identity/Account/Login">Login</a>
    </NotAuthorized>
</AuthorizeView>

В MainLayout компоненте (MainLayout) добавьте LoginDisplay компонент в <div> содержимое элемента верхней строки:

<div class="top-row px-4 auth">
    <LoginDisplay />
    <a href="https://docs.microsoft.com/aspnet/" target="_blank">About</a>
</div>

Конечные точки проверки подлинности стиля

Поскольку Blazor сервер использует RazorIdentity страницы страниц, стиль пользовательского интерфейса изменяется при переходе посетителя между Identity страницами и компонентами. Существует два варианта для адресации стилей инконгруаус:

IdentityКомпоненты сборки

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

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

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

Примечание

Пример в этом разделе является просто начальной точкой для настройки. Для лучшего взаимодействия с пользователем, скорее всего, потребуется дополнительная работа.

Создайте новый NavMenu_IdentityLayout компонент (NavMenu_IdentityLayout). Для разметки и кода компонента используйте то же содержимое NavMenu компонента приложения (NavMenu). Вывлекайте все NavLink компоненты, которые не могут быть анонимно подключены, так как автоматическое перенаправление в RedirectToLogin компоненте не выполняется для компонентов, нуждающихся в проверке подлинности или авторизации.

В файле pages/Shared/Layout. cshtml внесите следующие изменения:

  • Добавьте Razor директивы в начало файла, чтобы использовать вспомогательные функции тегов и компоненты приложения в Razor папке:

    @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
    @using {APPLICATION ASSEMBLY}.Shared
    

    Замените {APPLICATION ASSEMBLY} на имя сборки приложения.

  • Добавьте <base> тег и Blazor таблицу стилей <link> к <head> содержимому:

    <base href="~/" />
    <link rel="stylesheet" href="~/css/site.css" />
    
  • Измените содержимое <body> тега следующим образом:

    <div class="sidebar" style="float:left">
        <component type="typeof(NavMenu_IdentityLayout)" 
            render-mode="ServerPrerendered" />
    </div>
    
    <div class="main" style="padding-left:250px">
        <div class="top-row px-4">
            @{
                var result = Engine.FindView(ViewContext, "_LoginPartial", 
                    isMainPage: false);
            }
            @if (result.Success)
            {
                await Html.RenderPartialAsync("_LoginPartial");
            }
            else
            {
                throw new InvalidOperationException("The default Identity UI " +
                    "layout requires a partial view '_LoginPartial'.");
            }
            <a href="https://docs.microsoft.com/aspnet/" target="_blank">About</a>
        </div>
    
        <div class="content px-4">
            @RenderBody()
        </div>
    </div>
    
    <script src="~/Identity/lib/jquery/dist/jquery.min.js"></script>
    <script src="~/Identity/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
    <script src="~/Identity/js/site.js" asp-append-version="true"></script>
    @RenderSection("Scripts", required: false)
    <script src="_framework/blazor.server.js"></script>
    

Формирование шаблонов Identity в Blazor серверный проект с авторизацией

Запустите программу Identity формирования шаблонов:

  • В Обозреватель решенийщелкните правой кнопкой мыши проект добавитьНовыйшаблонный элемент.
  • В левой области диалогового окна Добавление нового шаблона элемента выберите . Выберите Identity в центральной области. Нажмите кнопку Добавить.
  • В диалоговом окне Добавить выберите нужные параметры.
    • Выберите существующую страницу макета, чтобы файл макета не перезаписывался неверной разметкой. При выборе существующего _Layout.cshtml файла он _Layout.cshtml перезаписывается. Например:
      • ~/Pages/Shared/_Layout.cshtml для Razor страниц или Blazor серверных проектов с Razor инфраструктурой существующих страниц.
      • ~/Views/Shared/_Layout.cshtml для проектов MVC или Blazor серверных проектов с существующей инфраструктурой MVC.
  • Чтобы использовать существующий контекст данных, выберите по меньшей мере один файл для переопределения. Необходимо выбрать по крайней мере один файл для добавления контекста данных.
    • Выберите класс контекста данных.
    • Выберите Добавить.
  • Чтобы создать новый контекст пользователя и, возможно, создать настраиваемый класс пользователя для Identity :
    • Нажмите + кнопку, чтобы создать новый +. Примите значение по умолчанию или укажите класс (например, MyApplication.Data.ApplicationDbContext ).
    • Выберите Добавить.

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

Запустите программу Identity формирования шаблонов:

  • В Обозреватель решенийщелкните правой кнопкой мыши проект добавитьНовыйшаблонный элемент.
  • В левой области диалогового окна Добавление шаблона выберите >>.
  • В диалоговом окне Добавить выберите нужные параметры.
    • Выберите существующую страницу макета, чтобы файл макета не перезаписывался неверной разметкой. При выборе существующего файла _layout. cshtml он не перезаписывается. Например:
      • ~/Pages/Shared/_Layout.cshtml для Razor страниц или Blazor серверных проектов с Razor инфраструктурой существующих страниц
      • ~/Views/Shared/_Layout.cshtml для проектов MVC или Blazor серверных проектов с существующей инфраструктурой MVC
  • Чтобы использовать существующий контекст данных, выберите по меньшей мере один файл для переопределения. Необходимо выбрать по крайней мере один файл для добавления контекста данных.
    • Выберите класс контекста данных.
    • Выберите Добавить.
  • Чтобы создать новый контекст пользователя и, возможно, создать настраиваемый класс пользователя для Identity :
    • Нажмите + кнопку, чтобы создать новый +. Примите значение по умолчанию или укажите класс (например, MyApplication.Data.ApplicationDbContext ).
    • Выберите Добавить.

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

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

Автономные или размещенные приложения веб – Blazor сборки

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

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

Более подробную информацию см. в разделе Blazor Security and Identity articles.

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

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

в следующем выделенном коде показаны изменения для замены пользовательского интерфейса по умолчанию IdentityIdentity в веб-приложении 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();

Следующий код задает файл cookie s. cookie authenticationoptions. логинпас "Data-ссылок =" абсолютный путь ">Логинпас , cookie cookie s. cookie authenticationoptions. логаутпас "Data-ссылок =" Absolute-Path ">Логаутпас и cookie s. cookie authenticationoptions. акцессдениедпас "Data-ссылок =" абсолютный путь ">Акцессдениедпас :

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 , для свойства в шаблонных страницах может потребоваться настройка PasswordOptionsPasswordIdentity . InputModelPassword свойства находятся в следующих файлах:

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

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

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

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

  • Шаблон Identity . Включить учетную запись. регистрация, учетная запись. Login и Account. Регистерконфирматион. Например:

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  • Обновите области или /Пажес/аккаунт/регистер.кштмл.КС , чтобы пользователи не могли зарегистрироваться из этой конечной точки:

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • Обновите области/ /Пажес/аккаунт/регистер.кштмл , чтобы они соответствовали предыдущим изменениям:

    @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>
    
  • Закомментируйте или удалите регистрационную ссылку из областей/ /Пажес/аккаунт/логин.кштмл

    @*
    <p>
        <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
    </p>
    *@
    
  • Обновите страницу области или /Пажес/аккаунт/регистерконфирматион .

    • Удалите код и ссылки из файла 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 ресурсов в веб-корне, см Introduction to Identity on ASP.NET Core . раздел.

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