Cvičení – konfigurace podpory architektury Identity

Dokončeno

Architektura Identity funguje hned a bez jakýchkoli přizpůsobení. Standardní komponenty uživatelského rozhraní Identity jsou zabalené do knihovny tříd .NET Standard Razor Class Library (RCL). Protože se používá RCL, je do projektu přidaných několik souborů.

Po použití prvotní migrace EF Core se vytvoří pomocné databázové tabulky. Následující obrázek znázorňuje schémata pomocných tabulek:

databázový diagram

Poznámka

Výše uvedený obrázek ukazuje klíče a relace v databázi. Klíč je jedna a nekonečná (strana 8) je mnoho. Databáze může mít 1 až 1, 1 až mnoho a mnoho typů vztahů. Klíče jsou jedinečné. Diagram ukazuje, jak jsou tato spojení vytvořena, a vztahy.

V této lekci bude architektura Identity přidána do existujícího projektu ASP.NET Core Razor Pages.

Přidání architektury Identity do projektu

  1. Nainstalujte generátor kódu ASP.NET Core:

    dotnet tool install dotnet-aspnet-codegenerator --version 3.1.2
    

    Objeví se následující výstup:

    You can invoke the tool from this directory using the following commands: 'dotnet tool run dotnet-aspnet-codegenerator' or 'dotnet dotnet-aspnet-codegenerator'.
    Tool 'dotnet-aspnet-codegenerator' (version '3.1.2') was successfully installed. Entry is added to the manifest file /home/<USER>/aspnet-learn/src/ContosoPets.Ui/.config/dotnet-tools.json.
    

    Generátor kódu je nástroj .NET Core, který:

    • Bude použit k přidání výchozích komponent Identity do projektu
    • Umožní přizpůsobení komponent uživatelského rozhraní Identity v další lekci
    • Bude v tomto modulu vyvolán přes dotnet aspnet-codegenerator
  2. Přidejte do projektu následující balíčky NuGet:

    dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design --version 3.1.2 && \
        dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore --version 3.1.3 && \
        dotnet add package Microsoft.AspNetCore.Identity.UI --version 3.1.3 && \
        dotnet add package Microsoft.EntityFrameworkCore.Design --version 3.1.3 && \
        dotnet add package Microsoft.EntityFrameworkCore.SqlServer --version 3.1.3
    

    Tyto balíčky nainstalují šablony a závislosti generování kódu, které generátor kódu používá.

    Tip

    Dostupné generátory zobrazíte takto:

    • V příkazovém prostředí spusťte dotnet aspnet-codegenerator -h.
    • V sadě Visual Studio klikněte v Průzkumníku řešení pravým tlačítkem na projekt a vyberte Přidat > Nová vygenerovaná položka.
  3. Použijte generátor kódu k přidání výchozích komponent Identity do projektu. V kořenovém adresáři projektu spusťte následující příkaz:

    dotnet aspnet-codegenerator identity \
        --useDefaultUI \
        --dbContext ContosoPetsAuth
    

    V předcházejícím příkazu:

    • Generátor identifikovaný jako identity se používá k přidání architektury identity do projektu.
    • Parametr --useDefaultUI udává, že se bude používat RCL obsahující výchozí prvky uživatelského rozhraní. K určení stylu komponent se použije Bootstrap.
    • Parametr --dbContext udává název třídy kontextu databáze EF Core, která se má vygenerovat.
  4. Klikněte na ikonu aktualizace editoru a aktualizujte Průzkumníka souborů.

    Ikona aktualizace Cloud Shell

    V kořenovém adresáři projektu se objeví adresářová struktura Areas:

    • Areas
      • Identity
        • Data
          • ContosoPetsAuth.cs
        • Pages
          • _ValidationScriptsPartial.cshtml
          • _ViewStart.cshtml
        • IdentityHostingStartup.cs

    Oblasti představují způsob, jak webovou aplikaci ASP.NET Core rozdělit do menších funkčních skupin.

Přidání poskytovatele databáze PostgreSQL

Spuštěním následujícího příkazu v kořenovém adresáři projektu nainstalujte poskytovatele databáze PostgreSQL pro EF Core:

dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL --version 3.1.3

Tento balíček NuGet informuje EF Core o tom, jak pracovat s databází PostgreSQL.

Konfigurace připojení k databázi

  1. Nahraďte metodu Configure v souboru Areas/Identity/IdentityHostingStartup.cs následujícím kódem:

    public void Configure(IWebHostBuilder builder)
    {
        builder.ConfigureServices((context, services) => {
            var connBuilder = new NpgsqlConnectionStringBuilder(
                context.Configuration.GetConnectionString("ContosoPetsAuthConnection"))
            {
                Username = context.Configuration["DbUsername"],
                Password = context.Configuration["DbPassword"]
            };
    
            services.AddDbContext<ContosoPetsAuth>(options =>
                options.UseNpgsql(connBuilder.ConnectionString));
    
            services.AddDefaultIdentity<IdentityUser>()
                .AddDefaultUI()
                .AddEntityFrameworkStores<ContosoPetsAuth>();
        });
    }
    
    public void Configure(IWebHostBuilder builder)
    {
        builder.ConfigureServices((context, services) => {
            var connBuilder = new SqlConnectionStringBuilder(
                context.Configuration.GetConnectionString("ContosoPetsAuthConnection"))
            {
                UserID = context.Configuration["DbUsername"],
                Password = context.Configuration["DbPassword"]
            };
    
            services.AddDbContext<ContosoPetsAuth>(options =>
                options.UseSqlServer(connBuilder.ConnectionString));
    
            services.AddDefaultIdentity<IdentityUser>()
                .AddDefaultUI()
                .AddEntityFrameworkStores<ContosoPetsAuth>();
        });
    }
    

    V předchozím kódu:

    • Zprostředkovatel konfigurace Azure Key Vault se implicitně používá k načtení uživatelského jména a hesla databáze:

      Username = context.Configuration["DbUsername"],
      Password = context.Configuration["DbPassword"]
      
      UserID = context.Configuration["DbUsername"],
      Password = context.Configuration["DbPassword"]
      
    • Uživatelské jméno a heslo databáze se vloží do připojovacího řetězce uloženého v souboru appsettings.json.

    • Třída kontextu databáze EF Core s názvem ContosoPetsAuth se nakonfiguruje s odpovídajícím připojovacím řetězcem.

    • Zaregistrují se služby Identity včetně výchozího uživatelského rozhraní, zprostředkovatelů tokenů a ověřování na základě souborů cookie.

  2. V souboru IdentityHostingStartup.cs přidejte také následující kód na začátek bloku příkazů using. Uložte provedené změny.

    using Npgsql;
    

    Předchozí kód přeloží odkaz na třídu NpgsqlConnectionStringBuilder v metodě Configure.

    using Microsoft.Data.SqlClient;
    

    Předchozí kód přeloží odkaz na třídu SqlConnectionStringBuilder v metodě Configure.

  3. V metodě Configure souboru Startup.cs nahraďte komentář // Add the app.UseAuthentication code následujícím kódem. Uložte provedené změny.

    app.UseAuthentication();
    

    Předchozí kód povolí možnosti ověřování. Konkrétně tak, že do kanálu pro zpracování požadavků HTTP aplikace přidá instanci ověřovacího middlewaru ASP.NET Core.

  4. Spuštěním následujícího příkazu zobrazte připojovací řetězec databáze na konzole. Zkopírujte připojovací řetězec do schránky.

    echo $dbConnectionString
    
  5. V souboru appsettings.json nahraďte připojovací řetězec pro ContosoPetsAuthConnection připojovacím řetězcem z předchozího kroku. Uložte provedené změny.

    Sekce ConnectionStrings by se měla podobat následujícímu souboru JSON:

    "ConnectionStrings": {
        "ContosoPetsAuthConnection": "Server={HOST NAME}.postgres.database.azure.com;Database=contosopets;Port=5432;Ssl Mode=Require;"
    }
    
    "ConnectionStrings": {
        "ContosoPetsAuthConnection": "Data Source={HOST NAME}.database.windows.net;Initial Catalog=ContosoPets;Connect Timeout=30;Encrypt=True;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"
    }
    
  6. Spuštěním následujícího příkazu sestavte aplikaci:

    dotnet build
    

    Sestavení proběhne úspěšně bez jakýchkoli upozornění. Pokud se sestavení nezdaří, zkontrolujte výstupní informace o odstraňování potíží.

Aktualizace databáze

  1. Nainstalujte migrační nástroj Entity Framework Core:

    dotnet tool install dotnet-ef --version 3.1.3
    

    Objeví se následující výstup:

    You can invoke the tool from this directory using the following commands: 'dotnet tool run dotnet-ef' or 'dotnet dotnet-ef'.
    Tool 'dotnet-ef' (version '3.1.3') was successfully installed. Entry is added to the manifest file /home/<USER>/aspnet-learn/src/ContosoPets.Ui/.config/dotnet-tools.json.
    

    Migračním nástrojem je nástroj .NET Core, který:

    • Generuje kód, nazývaný migrace, pro vytvoření a aktualizaci databáze, která podporuje model entity Identity.
    • Provádí migrace oproti existující databázi.
    • Bude v tomto modulu vyvolán přes dotnet ef.
  2. Vytvořte a spusťte migraci EF Core pro aktualizaci databáze:

    dotnet ef migrations add CreateIdentitySchema && \
        dotnet ef database update
    

    Při migraci EF Core CreateIdentitySchema se pomocí změnového skriptu DDL (Data Definition Language) vytvořily tabulky podporující architekturu Identity. Následující výňatek například vyobrazuje příkaz CREATE TABLE vygenerovaný migrací:

    info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (329ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      CREATE TABLE "AspNetUsers" (
          "Id" text NOT NULL,
          "UserName" character varying(256) NULL,
          "NormalizedUserName" character varying(256) NULL,
          "Email" character varying(256) NULL,
          "NormalizedEmail" character varying(256) NULL,
          "EmailConfirmed" boolean NOT NULL,
          "PasswordHash" text NULL,
          "SecurityStamp" text NULL,
          "ConcurrencyStamp" text NULL,
          "PhoneNumber" text NULL,
          "PhoneNumberConfirmed" boolean NOT NULL,
          "TwoFactorEnabled" boolean NOT NULL,
          "LockoutEnd" timestamp with time zone NULL,
          "LockoutEnabled" boolean NOT NULL,
          "AccessFailedCount" integer NOT NULL,
          CONSTRAINT "PK_AspNetUsers" PRIMARY KEY ("Id")
      );
    
    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])
          );
    
  3. Spuštěním následujícího příkazu vypište tabulky v databázi:

    db -c "SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname != 'pg_catalog' AND schemaname != 'information_schema' ORDER BY tablename"
    

    Výstup potvrzuje vytvoření tabulek:

           tablename
    -----------------------
     AspNetRoleClaims
     AspNetRoles
     AspNetUserClaims
     AspNetUserLogins
     AspNetUserRoles
     AspNetUserTokens
     AspNetUsers
     __EFMigrationsHistory
    (8 rows)
    
    db -Q "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='dbo' ORDER BY TABLE_NAME" -Y 25
    

    Zobrazí se následující výstup, který potvrzuje vytvoření tabulek.

    TABLE_NAME
    -------------------------
    __EFMigrationsHistory
    AspNetRoleClaims
    AspNetRoles
    AspNetUserClaims
    AspNetUserLogins
    AspNetUserRoles
    AspNetUsers
    AspNetUserTokens
    
    (8 rows affected)
    
  1. V souboru Pages/Shared/_Layout.cshtml nahraďte komentář @* Add the _LoginPartial partial view *@ následujícím kódem. Uložte provedené změny.

    <partial name="_LoginPartial" />
    

    Předchozí kód vykreslí v záhlaví každé stránky částečné zobrazení _LoginPartial, které používá výchozí rozložení. _LoginPartial bylo přidáno vygenerovaným kódem Identity. Toto částečné zobrazení nabízí uživateli odkazy pro přihlášení a registraci, pokud není přihlášený.

  2. Spuštěním následujícího příkazu sestavte aplikaci:

    dotnet build --no-restore
    

    Parametr --no-restore je použitý, protože od posledního sestavení nebyly přidány žádné balíčky NuGet. Proces sestavení vynechá obnovení balíčků NuGet a úspěšně se dokončí bez upozornění. Pokud se sestavení nezdaří, zkontrolujte výstupní informace o odstraňování potíží.

  3. Spuštěním následujícího příkazu nasaďte aplikaci do Azure App Service:

    az webapp up
    

    Poznámka

    Soubor .azure/config v kořenovém adresáři projektu obsahuje konfigurační hodnoty použité příkazem az webapp up.

  4. Spuštěním následujícího příkazu zobrazte adresu URL aplikace. V prohlížeči přejděte na tuto adresu URL.

    echo $webAppUrl
    
  5. Klikněte na odkaz pro registraci v záhlaví aplikace. Vyplněním formuláře vytvořte nový účet.

    Po úspěšné registraci:

    • Jste přesměrováni na domovskou stránku.
    • V záhlaví aplikace se zobrazuje text Hello [e-mailová adresa] a odkaz pro odhlášení.
    • Je vytvořený soubor cookie s názvem .AspNetCore.Identity.Application. Identity zachovává relace uživatelů pomocí ověřování na základě souborů cookie.
  6. Klikněte na odkaz pro odhlášení v záhlaví aplikace.

    Po úspěšném odhlášení se soubor cookie .AspNetCore.Identity.Application odstraní a ukončí tak relaci uživatele.