Упражнение. Настройка поддержки Identity

Завершено

Identity работает в исходном виде без каких-либо настроек. В этом уроке удостоверение добавляется в существующий проект ASP.NET Core Razor Pages.

Открытие начального проекта

Чтобы использовать рекомендуемое пространство кода GitHub, перейдите к пространствам кода для репозитория удостоверений MicrosoftDocs/mslearn-secure-aspnet-core-identity. Создайте новое пространство кода с помощью main ветви, а затем перейдите к разделу "Изучение приложения".

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

  1. В окне Visual Studio Code нажмите клавишу F1 , чтобы открыть палитру команд. Найдите и выберите "Контейнеры разработки": клонировать репозиторий в томе контейнера....

  2. Введите следующий URL-адрес репозитория: https://github.com/MicrosoftDocs/mslearn-secure-aspnet-core-identity main Выберите ветвь. Visual Studio Code создает контейнер разработки. Примите все запросы на установку рекомендуемых расширений.

  3. Перейдите к просмотру приложения.

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

  1. В окне терминала выполните следующую команду, чтобы получить начальный проект:

    git clone https://github.com/MicrosoftDocs/mslearn-secure-aspnet-core-identity
    
  2. Перейдите в каталог исходного кода и запустите Visual Studio Code:

    cd mslearn-secure-aspnet-core-identity
    code .
    

    Откроется Visual Studio Code. Примите все запросы на установку рекомендуемых расширений, но не нажимайте кнопку "Повторно открыть в контейнере ", если появится запрос. Перейдите к следующим шагам.

Просмотр приложения

  1. После загрузки проекта нажмите клавиши CTRL+SHIFT+`, чтобы открыть новую панель терминала.

  2. В новой панели терминала задайте расположение в каталоге RazorPagesPizza:

    cd RazorPagesPizza
    
  3. В области Обозреватель разверните каталог RazorPagesPizza, чтобы просмотреть код. RazorPagesPizza — это каталог проекта. Далее предполагается, что все пути, рассматриваемые в этом модуле, приведены относительно этого каталога.

    Давайте запустим приложение, чтобы быстро получить общее представление о нем.

  4. На панели терминала выполните сборку проекта и запустите приложение:

    dotnet run
    
  5. Обратите внимание на URL-адрес, отображаемый в выходных данных терминала. Например, https://localhost:7192.

  6. Откройте приложение в браузере. Для этого выделите URL-адрес с помощью комбинации клавиш CTRL+щелчок левой кнопкой мыши.

    Внимание

    Если вы используете контейнер разработки в локальной среде Docker, SSL-сертификат внутри контейнера не будет доверять браузеру. Чтобы просмотреть веб-приложение, необходимо выполнить одно из следующих действий:

    • Игнорировать ошибку сертификата. При использовании Microsoft Edge выберите Дополнительно и Продолжить на localhost (не рекомендуется). Конкретные детали могут отличаться в разных браузерах.
    • Сохраните сертификат и добавьте его в доверенные центры сертификации.
    • Импортируйте существующий сертификат разработки в контейнер. Дополнительные сведения см. в созданных комментариях в ./devcontainer/devcontainter.json.
  7. Просмотрите веб-приложение в браузере. Использование ссылок в заголовке:

    1. Перейдите к странице Список пицц.
    2. Вернитесь на главную страницу.

    Обратите внимание, что для проверки подлинности не требуется.

  8. Чтобы остановить приложение, нажмите клавиши CTRL+C в области терминала.

Добавление удостоверений ASP.NET Core в проект

Реализацию удостоверений по умолчанию можно добавить с помощью программ командной строки dotnet.

  1. Установите средство формирования шаблонов кода ASP.NET Core:

    dotnet tool install dotnet-aspnet-codegenerator --version 8.0.* --global
    

    Шаблон — это средство .NET, которое:

    • Используется для добавления компонентов удостоверений по умолчанию в проект.
    • Включает настройку компонентов пользовательского интерфейса удостоверений в следующем уроке.
    • Вызывается через dotnet aspnet-codegenerator этот модуль.
  2. Добавьте в проект следующие пакеты NuGet:

    dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design --version 8.0.*
    dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore --version 8.0.*
    dotnet add package Microsoft.AspNetCore.Identity.UI --version 8.0.*
    dotnet add package Microsoft.EntityFrameworkCore.Design --version 8.0.*
    dotnet add package Microsoft.EntityFrameworkCore.SqlServer --version 8.0.*
    dotnet add package Microsoft.EntityFrameworkCore.Tools --version 8.0.*
    

    Эти пакеты устанавливают шаблоны создания кода и зависимости, используемые средством формирования шаблонов.

    Совет

    Просмотр доступных генераторов:

    • В командной оболочке запустите dotnet aspnet-codegenerator -h.
    • В Visual Studio щелкните правой кнопкой мыши проект в обозревателе решений и выберите Добавить>Создать шаблонный элемент.
  3. Используйте средство формирования шаблонов для добавления компонентов Identity по умолчанию в проект. В терминале выполните следующую команду:

    dotnet aspnet-codegenerator identity --useDefaultUI --dbContext RazorPagesPizzaAuth --userClass RazorPagesPizzaUser
    

    В предыдущей команде используются следующие параметры:

    • Генератор, обозначенный как identity, используется для добавления платформы Identity в проект.
    • Параметр --useDefaultUI указывает, что используется библиотека классов Razor (RCL), содержащая элементы пользовательского интерфейса по умолчанию. Начальная загрузка используется для стиля компонентов.
    • Параметр --dbContext задает имя создаваемого класса контекста базы данных EF Core.
    • Параметр --userClass задает имя создаваемого класса пользователя. По умолчанию используется IdentityUserкласс пользователя, но так как класс пользователя расширен в более поздней единице, указывается настраиваемый класс RazorPagesPizzaUser пользователя. Класс RazorPagesPizzaUser является производным от IdentityUser.

    В каталоге RazorPagesPizza используется следующая структура каталогов Areas:

    • Areas
      • Identity (отображается в той же строке, что иОбласти)
        • Data
          • RazorPagesPizzaAuth.cs
          • RazorPagesPizzaUser.cs
        • Pages
          • _ValidationScriptsPartial.cshtml
          • _ViewStart.cshtml

    Совет

    Если каталог Areas не отображается в области "Обозреватель" автоматически, нажмите кнопку Обновить обозреватель в заголовке MSLEARN-SECURE-ASPNET-CORE-IDENTITY в области Обозреватель.

    Области предоставляют способ разбиения веб-приложения ASP.NET Core на более мелкие функциональные группы.

    Шаблон также сделал следующие выделенные изменения в Program.cs, переформатированные для удобства чтения:

    using Microsoft.AspNetCore.Identity;
    using Microsoft.EntityFrameworkCore;
    using RazorPagesPizza.Areas.Identity.Data;
    var builder = WebApplication.CreateBuilder(args);
    var connectionString = builder.Configuration.GetConnectionString("RazorPagesPizzaAuthConnection") 
        ?? throw new InvalidOperationException("Connection string 'RazorPagesPizzaAuthConnection' not found.");
    
    builder.Services.AddDbContext<RazorPagesPizzaAuth>(options => options.UseSqlServer(connectionString));
    
    builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
        .AddEntityFrameworkStores<RazorPagesPizzaAuth>();
    
    // Add services to the container.
    builder.Services.AddRazorPages();
    
    var app = builder.Build();
    
    // Configure the HTTP request pipeline.
    if (!app.Environment.IsDevelopment())
    {
        app.UseExceptionHandler("/Error");
        // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
        app.UseHsts();
    }
    
    app.UseHttpsRedirection();
    app.UseStaticFiles();
    
    app.UseRouting();
    
    app.UseAuthorization();
    
    app.MapRazorPages();
    
    app.Run();
    

    В предыдущем коде:

    • Строка подключения RazorPagesPizzaAuthConnection считывается из файла appsettings.json.
    • Класс контекста базы данных EF Core с именем RazorPagesPizzaAuth настроен со строкой подключения.
    • Регистрируются службы идентификации, включая пользовательский интерфейс по умолчанию, поставщиков токенов и проверку подлинности на основе файлов cookie.
      • .AddDefaultIdentity<RazorPagesPizzaUser> сообщает службам удостоверений использовать пользовательскую RazorPagesPizzaUser модель.
      • Лямбда-выражение options => options.SignIn.RequireConfirmedAccount = true указывает, что пользователи должны подтвердить свои учетные записи электронной почты.
      • .AddEntityFrameworkStores<RazorPagesPizzaAuth>() указывает, что удостоверения используют хранилище Entity Framework Core по умолчанию для своей базы данных. Используется RazorPagesPizzaAuth DbContext класс.

Настройка подключения к базе данных

Раздел ConnectionStrings в appsettings.json должен выглядеть аналогично следующему коду JSON:

"ConnectionStrings": {
    "RazorPagesPizzaAuthConnection": "Server=(localdb)\\mssqllocaldb;Database=RazorPagesPizza;Trusted_Connection=True;MultipleActiveResultSets=true"
}

Эта строка подключения указывает на экземпляр SQL Server Express LocalDB по умолчанию. Если вы разрабатываете локально, ничего не делать. Это правильный строка подключения.

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

"ConnectionStrings": {
    "RazorPagesPizzaAuthConnection": "Data Source=localhost;Initial Catalog=RazorPagesPizza;Integrated Security=False;User Id=sa;Password=P@ssw0rd;MultipleActiveResultSets=True;Encrypt=False"
}

При этом строка подключения обновляется для подключения к экземпляру SQL Server внутри контейнера.

Обновление базы данных

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

  1. Выполните сборку приложения с помощью следующей команды:

    dotnet build
    

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

  2. Установите средство миграции Entity Framework Core:

    dotnet tool install dotnet-ef --version 8.0.* --global
    

    Средство миграции — это средство .NET, которое:

    • Создает код, называемый миграцией для создания и обновления базы данных, поддерживающей модель сущности identity.
    • Выполняет миграцию в существующую базу данных.
    • Вызывается через dotnet ef этот модуль.
  3. Чтобы обновить базу данных, создайте и выполните миграцию EF Core:

    dotnet ef migrations add CreateIdentitySchema
    dotnet ef database update
    

    Миграция EF Core CreateIdentitySchema применила сценарий изменения языка описания данных (DDL) для создания таблиц, поддерживающих Identity. Например, следующие выходные данные содержат оператор CREATE TABLE, созданный миграцией:

    info: Microsoft.EntityFrameworkCore.Database.Command[20101]
          Executed DbCommand (98ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
          CREATE TABLE [AspNetUsers] (
              [Id] nvarchar(450) NOT NULL,
              [UserName] nvarchar(256) NULL,
              [NormalizedUserName] nvarchar(256) NULL,
              [Email] nvarchar(256) NULL,
              [NormalizedEmail] nvarchar(256) NULL,
              [EmailConfirmed] bit NOT NULL,
              [PasswordHash] nvarchar(max) NULL,
              [SecurityStamp] nvarchar(max) NULL,
              [ConcurrencyStamp] nvarchar(max) NULL,
              [PhoneNumber] nvarchar(max) NULL,
              [PhoneNumberConfirmed] bit NOT NULL,
              [TwoFactorEnabled] bit NOT NULL,
              [LockoutEnd] datetimeoffset NULL,
              [LockoutEnabled] bit NOT NULL,
              [AccessFailedCount] int NOT NULL,
              CONSTRAINT [PK_AspNetUsers] PRIMARY KEY ([Id])
          );
    

    Совет

    Выдала ли команда ef сообщение об ошибке о том, что LocalDb не поддерживается? Убедитесь, что вы установили строка подключения, как описано в разделе "Настройка подключения к базе данных".

  4. При необходимости расширение SQL Server было добавлено в Visual Studio Code, когда вы приняли рекомендуемые расширения. Нажмите клавиши CTRL+ALT+D, чтобы переключиться на панель SQL Server.

  5. Разверните узлы в существующем подключении к базе данных. Разверните узел Базы данных, узел RazorPagesPizza и, наконец, узел Таблицы. Обратите внимание на список таблиц. Он подтверждает успешное выполнение миграции.

    База данных RazorPagesPizza с новыми созданными таблицами.

    Примечание.

    На предыдущем рисунке показан пример использования SQL Server Express LocalDB. При использовании .devcontainer соединение называется mssql-container.

Вернитесь к области обозревателя . В Pages/Shared/_Layout.cshtml замените комментарий @* Add the _LoginPartial partial view *@ следующим кодом.

<partial name="_LoginPartial" />

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

Тестирование функциональных возможностей удостоверений

Мы сделали все, что необходимо для добавления реализации удостоверений по умолчанию. Пора протестировать удостоверения!

  1. Сохраните все изменения.

  2. На панели терминала выполните сборку проекта и запустите приложение:

    dotnet run
    
  3. Перейдите к приложению в браузере, как и прежде.

  4. Выберите ссылку "Регистрация " в заголовке приложения. Заполните форму, чтобы создать учетную запись.

    Откроется страница Подтверждение регистрации. Так как приложение не настроено на отправку сообщений электронной почты с подтверждением, на этой странице указана ссылка на подтверждение.

  5. Выберите ссылку подтверждения. Отображается сообщение с запросом подтверждения.

  6. Выберите ссылку "Вход" в заголовке приложения и войдите.

    После успешного входа:

    • Вы перейдете на домашнюю страницу.
    • Заголовок приложения отображает hello [адрес электронной почты]! и ссылку выхода .
    • Создается файл cookie с именем .AspNetCore.Identity.Application. Identity сохраняет пользовательские сеансы с проверкой подлинности на основе файлов cookie.
  7. Выберите ссылку выхода в заголовке приложения.

    После успешного выхода файл cookie .AspNetCore.Identity.Application удаляется для завершения пользовательского сеанса.

  8. Чтобы остановить приложение, нажмите клавиши CTRL+C в области терминала.

Итоги

В этом уроке вы добавили реализацию удостоверений по умолчанию в существующее веб-приложение. В следующем уроке вы узнаете о настройке удостоверений и расширении модели данных удостоверений.