Поделиться через


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

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

BlazorIdentity леса

ASP.NET Шаблон Core добавляет ASP.NET Core IdentityIdentity в Blazor Web Appприложения и Blazor Server приложения. После добавления IdentityRazor компонентов в приложение можно настроить компоненты в соответствии с требованиями приложения.

Несмотря на то что шаблон создает необходимый код C# для формирования шаблонов Identity в приложении, необходимо обновить базу данных проекта с помощью миграции базы данных Entity Framework (EF) 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 .

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

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

Identity Шаблон в Blazor проект

Этот раздел относится к приложениям Blazor Web Appи Blazor Server приложениям.

Запустите шаблон:Identity

  • В Обозреватель решений щелкните правой кнопкой мыши проект> "Добавить>новый шаблонный элемент".
  • В левой области диалогового окна "Добавить новый шаблонный элемент" выберите Identity. Выберите Blazor Identity в центральной области. Нажмите кнопку Добавить.
  • В диалоговом окне добавленияIdentityBlazor:
    • Нажмите или добавьте кнопку плюс (+) класс контекста базы данных (класс DbContext).
    • Выберите поставщика базы данных (поставщик базы данных), который по умолчанию используется для SQL Server.
    • Нажмите или добавьте кнопку "плюс" (+) для пользовательского класса (класс User).
    • Нажмите кнопку Добавить.

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

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

В Обозреватель решений дважды щелкните подключенные службы. В области зависимостей служб SQL Server Express LocalDB выберите многоточие (...) и добавьте миграцию.

Присвойте миграции имя миграции, например CreateIdentitySchemaимя, описывающее миграцию. Дождитесь загрузки контекста базы данных в поле имен классов DbContext, которое может занять несколько секунд. Нажмите кнопку "Готово ", чтобы создать миграцию.

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

Снова выберите многоточие (...), а затем команду "Обновить базу данных ".

Откроется база данных обновления с помощью последнего диалогового окна миграции . Подождите, пока поле имен классов DbContext будет обновлено и до загрузки предыдущих миграций, что может занять несколько секунд. Нажмите кнопку Готово.

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

Команда базы данных обновления выполняет 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

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

Миграции, ИспользованиеAuthentication и макет

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

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

В Обозреватель решений дважды щелкните подключенные службы. В области зависимостей служб SQL Server Express LocalDB выберите многоточие (...) и добавьте миграцию.

Присвойте миграции имя миграции, например CreateIdentitySchemaимя, описывающее миграцию. Дождитесь загрузки контекста базы данных в поле имен классов DbContext, которое может занять несколько секунд. Нажмите кнопку "Готово ", чтобы создать миграцию.

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

Снова выберите многоточие (...), а затем команду "Обновить базу данных ".

Откроется база данных обновления с помощью последнего диалогового окна миграции . Подождите, пока поле имен классов DbContext будет обновлено и до загрузки предыдущих миграций, что может занять несколько секунд. Нажмите кнопку Готово.

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

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

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

В Обозреватель решений дважды щелкните подключенные службы. В области зависимостей служб SQL Server Express LocalDB выберите многоточие (...), а затем команду "Обновить базу данных".

Откроется база данных обновления с помощью последнего диалогового окна миграции . Подождите, пока поле имен классов DbContext будет обновлено и до загрузки предыдущих миграций, что может занять несколько секунд. Нажмите кнопку Готово.

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

Вы можете подтвердить приложение схемы с помощью следующей 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

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

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

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

Примечание.

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


Запустите шаблон:Identity

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

Необязательно. Добавьте частичное имя входа (_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 (EF) Core. Если миграция для создания Identity схемы не была создана и применена к базе данных, создайте миграцию и обновите базу данных.

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

В Обозреватель решений дважды щелкните подключенные службы. В области зависимостей служб SQL Server Express LocalDB выберите многоточие (...) и добавьте миграцию.

Присвойте миграции имя миграции, например CreateIdentitySchemaимя, описывающее миграцию. Дождитесь загрузки контекста базы данных в поле имен классов DbContext, которое может занять несколько секунд. Нажмите кнопку "Готово ", чтобы создать миграцию.

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

Снова выберите многоточие (...), а затем команду "Обновить базу данных ".

Откроется база данных обновления с помощью последнего диалогового окна миграции . Подождите, пока поле имен классов DbContext будет обновлено и до загрузки предыдущих миграций, что может занять несколько секунд. Нажмите кнопку Готово.

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

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

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

В Обозреватель решений дважды щелкните подключенные службы. В области зависимостей служб SQL Server Express LocalDB выберите многоточие (...), а затем команду "Обновить базу данных".

Откроется база данных обновления с помощью последнего диалогового окна миграции . Подождите, пока поле имен классов DbContext будет обновлено и до загрузки предыдущих миграций, что может занять несколько секунд. Нажмите кнопку Готово.

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

Вы можете подтвердить приложение схемы с помощью следующей 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

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

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

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

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

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

  • 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. Вы можете создать исходный код, чтобы изменить код и тем самым изменить поведение. Например, вы можете указать шаблону создать код, используемый при регистрации. Созданный код имеет приоритет над тем же кодом в RCL для Identity. Чтобы получить полный контроль над пользовательским интерфейсом и не использовать RCL по умолчанию, см. раздел "Создание полного Identity источника пользовательского интерфейса".

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

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

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

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

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

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

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

Примечание.

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


Запустите шаблон:Identity

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

Миграции, ИспользованиеAuthentication и макет

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

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

В Обозреватель решений дважды щелкните подключенные службы. В области зависимостей служб SQL Server Express LocalDB выберите многоточие (...) и добавьте миграцию.

Присвойте миграции имя миграции, например CreateIdentitySchemaимя, описывающее миграцию. Дождитесь загрузки контекста базы данных в поле имен классов DbContext, которое может занять несколько секунд. Нажмите кнопку "Готово ", чтобы создать миграцию.

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

Снова выберите многоточие (...), а затем команду "Обновить базу данных ".

Откроется база данных обновления с помощью последнего диалогового окна миграции . Подождите, пока поле имен классов DbContext будет обновлено и до загрузки предыдущих миграций, что может занять несколько секунд. Нажмите кнопку Готово.

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

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

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

В Обозреватель решений дважды щелкните подключенные службы. В области зависимостей служб SQL Server Express LocalDB выберите многоточие (...), а затем команду "Обновить базу данных".

Откроется база данных обновления с помощью последнего диалогового окна миграции . Подождите, пока поле имен классов DbContext будет обновлено и до загрузки предыдущих миграций, что может занять несколько секунд. Нажмите кнопку Готово.

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

Вы можете подтвердить приложение схемы с помощью следующей 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

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

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

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

Примечание.

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


Запустите шаблон:Identity

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

Необязательно. Добавьте частичное имя входа (_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 (EF) Core. Если миграция для создания Identity схемы не была создана и применена к базе данных, создайте миграцию и обновите базу данных.

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

В Обозреватель решений дважды щелкните подключенные службы. В области зависимостей служб SQL Server Express LocalDB выберите многоточие (...) и добавьте миграцию.

Присвойте миграции имя миграции, например CreateIdentitySchemaимя, описывающее миграцию. Дождитесь загрузки контекста базы данных в поле имен классов DbContext, которое может занять несколько секунд. Нажмите кнопку "Готово ", чтобы создать миграцию.

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

Снова выберите многоточие (...), а затем команду "Обновить базу данных ".

Откроется база данных обновления с помощью последнего диалогового окна миграции . Подождите, пока поле имен классов DbContext будет обновлено и до загрузки предыдущих миграций, что может занять несколько секунд. Нажмите кнопку Готово.

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

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

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

В Обозреватель решений дважды щелкните подключенные службы. В области зависимостей служб SQL Server Express LocalDB выберите многоточие (...), а затем команду "Обновить базу данных".

Откроется база данных обновления с помощью последнего диалогового окна миграции . Подождите, пока поле имен классов DbContext будет обновлено и до загрузки предыдущих миграций, что может занять несколько секунд. Нажмите кнопку Готово.

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

Вы можете подтвердить приложение схемы с помощью следующей 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

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

Identity Шаблон в серверное Blazor приложение с авторизацией

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

Примечание.

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


Запустите шаблон:Identity

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

Миграции

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

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

В Обозреватель решений дважды щелкните подключенные службы. В области зависимостей служб SQL Server Express LocalDB выберите многоточие (...) и добавьте миграцию.

Присвойте миграции имя миграции, например CreateIdentitySchemaимя, описывающее миграцию. Дождитесь загрузки контекста базы данных в поле имен классов DbContext, которое может занять несколько секунд. Нажмите кнопку "Готово ", чтобы создать миграцию.

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

Снова выберите многоточие (...), а затем команду "Обновить базу данных ".

Откроется база данных обновления с помощью последнего диалогового окна миграции . Подождите, пока поле имен классов DbContext будет обновлено и до загрузки предыдущих миграций, что может занять несколько секунд. Нажмите кнопку Готово.

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

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

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

В Обозреватель решений дважды щелкните подключенные службы. В области зависимостей служб SQL Server Express LocalDB выберите многоточие (...), а затем команду "Обновить базу данных".

Откроется база данных обновления с помощью последнего диалогового окна миграции . Подождите, пока поле имен классов DbContext будет обновлено и до загрузки предыдущих миграций, что может занять несколько секунд. Нажмите кнопку Готово.

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

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

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

Get-Migration

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

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

Так как серверные 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 компонентов с помощью серверного Identityприложения ASP.NET Core. Рекомендации по созданию веб-API для приложений см. в статье "Вызов веб-API" Blazor из приложения ASP.NET CoreBlazor.

Подход к использованию Razor компонентов вместо Razor Identity страниц заключается в создании собственных пользовательских 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] для свойства в шаблонных Identity страницах может потребоваться Password конфигурация атрибута. InputModelPassword свойства находятся в следующих файлах:

  • 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. Вы можете создать исходный код, чтобы изменить код и тем самым изменить поведение. Например, вы можете указать шаблону создать код, используемый при регистрации. Созданный код имеет приоритет над тем же кодом в RCL для Identity. Чтобы получить полный контроль над пользовательским интерфейсом и не использовать 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

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

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 (EF) Core. Если миграция для создания Identity схемы не была создана и применена к базе данных, создайте миграцию и обновите базу данных.

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

В Обозреватель решений дважды щелкните подключенные службы. В области зависимостей служб SQL Server Express LocalDB выберите многоточие (...) и добавьте миграцию.

Присвойте миграции имя миграции, например CreateIdentitySchemaимя, описывающее миграцию. Дождитесь загрузки контекста базы данных в поле имен классов DbContext, которое может занять несколько секунд. Нажмите кнопку "Готово ", чтобы создать миграцию.

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

Снова выберите многоточие (...), а затем команду "Обновить базу данных ".

Откроется база данных обновления с помощью последнего диалогового окна миграции . Подождите, пока поле имен классов DbContext будет обновлено и до загрузки предыдущих миграций, что может занять несколько секунд. Нажмите кнопку Готово.

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

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

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

В Обозреватель решений дважды щелкните подключенные службы. В области зависимостей служб SQL Server Express LocalDB выберите многоточие (...), а затем команду "Обновить базу данных".

Откроется база данных обновления с помощью последнего диалогового окна миграции . Подождите, пока поле имен классов DbContext будет обновлено и до загрузки предыдущих миграций, что может занять несколько секунд. Нажмите кнопку Готово.

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

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

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

Get-Migration

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

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

Запустите шаблон:Identity

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

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

Миграции, ИспользованиеAuthentication и макет

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

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

В Обозреватель решений дважды щелкните подключенные службы. В области зависимостей служб SQL Server Express LocalDB выберите многоточие (...) и добавьте миграцию.

Присвойте миграции имя миграции, например CreateIdentitySchemaимя, описывающее миграцию. Дождитесь загрузки контекста базы данных в поле имен классов DbContext, которое может занять несколько секунд. Нажмите кнопку "Готово ", чтобы создать миграцию.

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

Снова выберите многоточие (...), а затем команду "Обновить базу данных ".

Откроется база данных обновления с помощью последнего диалогового окна миграции . Подождите, пока поле имен классов DbContext будет обновлено и до загрузки предыдущих миграций, что может занять несколько секунд. Нажмите кнопку Готово.

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

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

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

В Обозреватель решений дважды щелкните подключенные службы. В области зависимостей служб SQL Server Express LocalDB выберите многоточие (...), а затем команду "Обновить базу данных".

Откроется база данных обновления с помощью последнего диалогового окна миграции . Подождите, пока поле имен классов DbContext будет обновлено и до загрузки предыдущих миграций, что может занять несколько секунд. Нажмите кнопку Готово.

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

Вы можете подтвердить приложение схемы с помощью следующей 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

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

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

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

Запустите шаблон:Identity

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

Необязательно. Добавьте частичное имя входа (_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>

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

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

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

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

В Обозреватель решений дважды щелкните подключенные службы. В области зависимостей служб SQL Server Express LocalDB выберите многоточие (...) и добавьте миграцию.

Присвойте миграции имя миграции, например CreateIdentitySchemaимя, описывающее миграцию. Дождитесь загрузки контекста базы данных в поле имен классов DbContext, которое может занять несколько секунд. Нажмите кнопку "Готово ", чтобы создать миграцию.

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

Снова выберите многоточие (...), а затем команду "Обновить базу данных ".

Откроется база данных обновления с помощью последнего диалогового окна миграции . Подождите, пока поле имен классов DbContext будет обновлено и до загрузки предыдущих миграций, что может занять несколько секунд. Нажмите кнопку Готово.

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

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

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

В Обозреватель решений дважды щелкните подключенные службы. В области зависимостей служб SQL Server Express LocalDB выберите многоточие (...), а затем команду "Обновить базу данных".

Откроется база данных обновления с помощью последнего диалогового окна миграции . Подождите, пока поле имен классов DbContext будет обновлено и до загрузки предыдущих миграций, что может занять несколько секунд. Нажмите кнопку Готово.

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

Вы можете подтвердить приложение схемы с помощью следующей 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

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

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

Запустите шаблон:Identity

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

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

Миграции

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

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

В Обозреватель решений дважды щелкните подключенные службы. В области зависимостей служб SQL Server Express LocalDB выберите многоточие (...) и добавьте миграцию.

Присвойте миграции имя миграции, например CreateIdentitySchemaимя, описывающее миграцию. Дождитесь загрузки контекста базы данных в поле имен классов DbContext, которое может занять несколько секунд. Нажмите кнопку "Готово ", чтобы создать миграцию.

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

Снова выберите многоточие (...), а затем команду "Обновить базу данных ".

Откроется база данных обновления с помощью последнего диалогового окна миграции . Подождите, пока поле имен классов DbContext будет обновлено и до загрузки предыдущих миграций, что может занять несколько секунд. Нажмите кнопку Готово.

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

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

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

В Обозреватель решений дважды щелкните подключенные службы. В области зависимостей служб SQL Server Express LocalDB выберите многоточие (...), а затем команду "Обновить базу данных".

Откроется база данных обновления с помощью последнего диалогового окна миграции . Подождите, пока поле имен классов DbContext будет обновлено и до загрузки предыдущих миграций, что может занять несколько секунд. Нажмите кнопку Готово.

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

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

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

Get-Migration

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

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

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

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

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

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

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

Identity Шаблон в серверное Blazor приложение с авторизацией

Запустите шаблон:Identity

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

Некоторые 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();

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

  • 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 и более поздних версий