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

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

ASP.NET Core предоставляет ASP.NET CoreIdentityв виде библиотеки Razorклассов. Приложения, включающие в себя Identity , могут применять шаблон для выборочного добавления исходного кода, содержащегося в библиотеке IdentityRazor классов (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 Core. Если миграция для создания Identity схемы не была создана и применена к базе данных, создайте миграцию и обновите базу данных. Например, выполните следующие команды:

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

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

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

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

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

Update-Database

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

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

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

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

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

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

Update-Database

Вы можете подтвердить приложение схемы с помощью следующей 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).
    • Нажмите кнопку "Добавить", чтобы запустить шаблон.

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

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

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

Дополнительные сведения см. в 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>
    *@
    
  • Обновите страницу "Области"/Pages/IdentityAccount/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 CoreIdentityв виде библиотеки Razorклассов. Приложения, включающие в себя Identity , могут применять шаблон для выборочного добавления исходного кода, содержащегося в библиотеке IdentityRazor классов (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 Core. Если миграция для создания Identity схемы не была создана и применена к базе данных, создайте миграцию и обновите базу данных. Например, выполните следующие команды:

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

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

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

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

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

Update-Database

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

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

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

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

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

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

Update-Database

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

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

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

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

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

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

Update-Database

Вы можете подтвердить приложение схемы с помощью следующей 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 компонентов вместо RazorIdentity страниц заключается в создании собственных пользовательских 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>
    *@
    
  • Обновите страницу "Области"/Pages/IdentityAccount/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 CoreIdentityв виде библиотеки Razorклассов. Приложения, включающие в себя Identity , могут применять шаблон для выборочного добавления исходного кода, содержащегося в библиотеке IdentityRazor классов (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 Core. Если миграция для создания Identity схемы не была создана и применена к базе данных, создайте миграцию и обновите базу данных. Например, выполните следующие команды:

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

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

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

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

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

Update-Database

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

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

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

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

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

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

Update-Database

Вы можете подтвердить приложение схемы с помощью следующей 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>
  • Перемещение файла в Pages/Shared/_LoginPartial.cshtmlViews/Shared/_LoginPartial.cshtml

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

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

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

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

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

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

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

Update-Database

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

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

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

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

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

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

Update-Database

Вы можете подтвердить приложение схемы с помощью следующей 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>
    *@
    
  • Обновите страницу "Области"/Pages/IdentityAccount/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".

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