Ćwiczenie — konfigurowanie obsługi mechanizmu Identity

Ukończone

Mechanizm Identity działa od razu bez żadnych dostosowań. W tej lekcji tożsamość jest dodawana do istniejącego projektu platformy Razor Pages ASP.NET Core.

Uzyskiwanie i otwieranie projektu startowego

Uwaga

Jeśli chcesz użyć elementu .devcontainer w usłudze GitHub Codespaces, przejdź do obszaru Codespaces dla repozytorium MicrosoftDocs/mslearn-secure-aspnet-core-identity . Utwórz nową przestrzeń kodu przy użyciu main gałęzi , a następnie przejdź do kroku 3.

  1. W oknie terminalu uruchom następujące polecenie, aby uzyskać projekt startowy:

    git clone https://github.com/MicrosoftDocs/mslearn-secure-aspnet-core-identity
    
  2. Przejdź do katalogu kodu źródłowego i uruchom Visual Studio Code:

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

    Visual Studio Code zostanie otwarta. Zaakceptuj wszelkie monity o zainstalowanie zalecanych rozszerzeń lub wybierz pozycję Otwórz ponownie w kontenerze , jeśli chcesz użyć elementu .devcontainer.

    Porada

    Jeśli pominiesz monit o ponowne otwarcie w kontenerze, naciśnij klawisze Ctrl+Shift+P , aby otworzyć paletę poleceń, a następnie wyszukaj i wybierz pozycję Dev Containers: Otwórz ponownie w kontenerze.

  3. Po załadowaniu projektu (lokalnie lub w kontenerze) naciśnij klawisze Ctrl+Shift+` , aby otworzyć nowe okienko terminalu.

  4. W nowym okienku terminalu ustaw lokalizację na katalog RazorPagesPizza :

    cd RazorPagesPizza
    
  5. W okienku Eksplorator rozwiń katalog RazorPagesPizza , aby wyświetlić kod. RazorPagesPizza to katalog projektu. Podczas kontynuowania przyjmij, że wszystkie ścieżki omówione w tym module są powiązane z tą lokalizacją.

Eksplorowanie aplikacji

Uruchommy aplikację, aby szybko wprowadzić.

  1. W okienku terminalu skompiluj projekt i uruchom aplikację:

    dotnet run
    
  2. Zanotuj adres URL wyświetlany w danych wyjściowych terminalu. Na przykład https://localhost:7192.

  3. Otwórz aplikację w przeglądarce, wybierając adres URL zapomocą klawiszaCtrl+.

    Ważne

    Jeśli używasz kontenera .devcontainer na platformie Docker, certyfikat SSL z wewnątrz kontenera nie będzie zaufany przez przeglądarkę. Aby wyświetlić aplikację internetową, należy wykonać jedną z następujących czynności:

    • Zignoruj błąd certyfikatu. W przypadku korzystania z przeglądarki Microsoft Edge wybierz pozycję Zaawansowane i przejdź do hosta lokalnego (niezalecane). Szczegóły różnią się w zależności od przeglądarki.
    • Zapisz certyfikat i dodaj go do zaufanych urzędów certyfikacji.
    • Zaimportuj istniejący certyfikat dewelopera wewnątrz kontenera. Aby uzyskać więcej informacji, zobacz wygenerowane komentarze w pliku ./devcontainer/devcontainter.json.

    Jeśli zdecydujesz się zaimportować istniejący certyfikat deweloperski wewnątrz kontenera, ścieżka kontenera /root/.aspnet/ zostanie uwidoczniona jako .devcontainer/persisted-data/.aspnet poza kontenerem. Jest to dla Twojej wygody.

    Jeśli używasz elementu .devcontainer w usłudze GitHub Codespaces, nie jest wymagana żadna akcja. Usługa Codespaces automatycznie obsługuje połączenie SSL serwera proxy.

  4. Zapoznaj się z aplikacją internetową w przeglądarce. Za pomocą linków w nagłówku:

    1. Przejdź do listy pizzy
    2. Przechodzenie z powrotem do strony głównej

    Zauważ, że nie jest wymagane do uwierzytelnienia.

  5. Naciśnij klawisze Ctrl+C w okienku terminalu, aby zatrzymać aplikację.

Dodawanie tożsamości ASP.NET Core do projektu

Domyślną implementację tożsamości można dodać za pomocą dotnet narzędzi wiersza polecenia.

  1. Zainstaluj generator szkieletów kodu platformy ASP.NET Core:

    dotnet tool install dotnet-aspnet-codegenerator --version 6.0.2 --global
    

    Szkielet jest narzędziem platformy .NET Core, które:

    • Służy do dodawania domyślnych składników tożsamości do projektu.
    • Umożliwia dostosowywanie składników interfejsu użytkownika tożsamości w następnej lekcji.
    • Jest wywoływany za pomocą polecenia dotnet aspnet-codegenerator w tym module.
  2. Dodaj następujące pakiety NuGet do projektu:

    dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design --version 6.0.2
    dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore --version 6.0.3
    dotnet add package Microsoft.AspNetCore.Identity.UI --version 6.0.3
    dotnet add package Microsoft.EntityFrameworkCore.Design --version 6.0.3
    dotnet add package Microsoft.EntityFrameworkCore.SqlServer --version 6.0.3
    

    Te pakiety instalują szablony generowania kodu i zależności, które są używane przez generator szkieletów.

    Porada

    Aby wyświetlić dostępne generatory:

    • W powłoce poleceń uruchom polecenie dotnet aspnet-codegenerator -h.
    • W programie Visual Studio kliknij prawym przyciskiem myszy projekt w Eksploratorze rozwiązań i wybierz pozycję Dodaj>Nowy element szkieletowy.
  3. Użyj generatora szkieletów, aby dodać do projektu domyślne składniki mechanizmu Identity. W terminalu uruchom następujące polecenie:

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

    W powyższym poleceniu:

    • Generator zidentyfikowany jako identity jest używany do dodawania struktury Identity do projektu.
    • Opcja --useDefaultUI wskazuje, że jest używana biblioteka klas Razor (RCL) zawierająca domyślne elementy interfejsu użytkownika. Bootstrap służy do określania stylu składników.
    • Opcja --dbContext określa nazwę klasy kontekstu bazy danych EF Core do wygenerowania.

    Następująca Areas struktura katalogów jest wyświetlana w katalogu RazorPagesPizza :

    • Areas
      • Identity (jest wyświetlany w tym samym wierszu co obszary)
        • Data
          • RazorPagesPizzaAuth.cs
        • Pages
          • _ValidationScriptsPartial.cshtml
          • _ViewStart.cshtml

    Porada

    Areas Jeśli katalog nie zostanie automatycznie wyświetlony w okienku Eksplorator, wybierz przycisk Odśwież Eksplorator w nagłówku MSLEARN-SECURE-ASPNET-CORE-IDENTITY w okienku Eksplorator.

    Obszary umożliwiają dzielenie aplikacji internetowej ASP.NET Core na mniejsze grupy funkcjonalne.

    Ruszter dokonał również następujących wyróżnionych zmian w pliku Program.cs, sformatowanych w celu zapewnienia czytelności:

    using Microsoft.AspNetCore.Identity;
    using Microsoft.EntityFrameworkCore;
    using RazorPagesPizza.Areas.Identity.Data;
    var builder = WebApplication.CreateBuilder(args);
    var connectionString = builder.Configuration.GetConnectionString("RazorPagesPizzaAuthConnection"); 
    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.UseAuthentication();
    app.UseAuthorization();
    
    app.MapRazorPages();
    
    app.Run();
    

    Powyższy kod ma następujące działanie:

    • Parametry RazorPagesPizzaAuthConnection połączenia są odczytywane z pliku appsettings.json.
    • Klasa kontekstu bazy danych EF Core o nazwie RazorPagesPizzaAuthjest skonfigurowana przy użyciu parametrów połączenia.
    • Usługi mechanizmu Identity są rejestrowane, w tym domyślny interfejs użytkownika, dostawcy tokenów i uwierzytelnianie oparte na plikach cookie.
      • .AddDefaultIdentity<IdentityUser> polecenie usług identity do korzystania z domyślnego modelu użytkownika.
      • Wyrażenie options => options.SignIn.RequireConfirmedAccount = true lambda określa, że użytkownicy muszą potwierdzić swoje konta e-mail.
      • .AddEntityFrameworkStores<RazorPagesPizzaAuth>() Określa, że tożsamość używa domyślnego magazynu Entity Framework Core dla swojej bazy danych. Używana RazorPagesPizzaAuthDbContext jest klasa .
    • app.UseAuthentication(); umożliwia uwierzytelnianie. Dokładniej mówiąc, wystąpienie oprogramowania pośredniczącego uwierzytelniania ASP.NET Core zostało dodane do potoku obsługi żądań HTTP aplikacji.

Konfigurowanie połączenia z bazą danych

Sekcja ConnectionStrings w pliku appsettings.json powinna wyglądać podobnie do następującego kodu JSON:

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

Te parametry połączenia domyślnie wskazuje wystąpienie SQL Server Express LocalDB. Jeśli używasz elementu .devcontainer, musisz zmienić parametry połączenia w następujący sposób! Zapisz zmiany.

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

Spowoduje to zaktualizowanie parametrów połączenia w celu nawiązania połączenia z wystąpieniem SQL Server wewnątrz kontenera.

Aktualizowanie bazy danych

Po zweryfikowaniu parametrów połączenia możesz wygenerować i uruchomić migrację w celu skompilowania bazy danych.

  1. Uruchom następujące polecenie, aby skompilować aplikację:

    dotnet build
    

    Kompilacja zakończy się pomyślnie bez ostrzeżeń. Jeśli kompilacja zakończy się niepowodzeniem, sprawdź dane wyjściowe, aby uzyskać informacje dotyczące rozwiązywania problemów.

  2. Zainstaluj narzędzie do migracji platformy Entity Framework Core:

    dotnet tool install dotnet-ef --version 6.0.3 --global
    

    Narzędzie do migracji to narzędzie platformy .NET, które:

    • Generuje kod nazywany migracją w celu utworzenia i zaktualizowania bazy danych obsługującej model jednostki Identity.
    • Wykonuje migracje do istniejącej bazy danych.
    • Jest wywoływany za pomocą polecenia dotnet ef w tym module.
  3. Utwórz i uruchom migrację EF Core, aby zaktualizować bazę danych:

    dotnet ef migrations add CreateIdentitySchema
    dotnet ef database update
    

    Migracja CreateIdentitySchema platformy EF Core zastosowała skrypt zmiany języka definicji danych (DDL), aby utworzyć tabele obsługujące mechanizm Identity. Na przykład następujące dane wyjściowe przedstawiają instrukcję CREATE TABLE wygenerowaną przez migrację:

    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])
          );
    

    Porada

    ef Czy polecenie zgłosiło błąd dotyczący nieobsługiwanej bazy danych LocalDb? Upewnij się, że ustawiono parametry połączenia zgodnie z opisem w sekcji "Konfigurowanie połączenia z bazą danych".

  4. Rozszerzenie SQL Server zostało dodane do Visual Studio Code w razie potrzeby po zaakceptowaniu zalecanych rozszerzeń. Naciśnij klawisze Ctrl+Alt+D, aby przełączyć się do okienka SQL Server.

  5. Rozwiń węzły w ramach istniejącego połączenia z bazą danych. Rozwiń węzeł Bazy danych , węzeł RazorPagesPizza , a na koniec węzeł Tabele . Zanotuj listę tabel. Potwierdza to, że migracja zakończyła się pomyślnie.

    Baza danych RazorPagesPizza z nowo utworzonymi tabelami.

    Uwaga

    Na powyższym obrazie przedstawiono przykład użycia SQL Server Express LocalDB. W przypadku korzystania z pliku devcontainer połączenie nosi nazwę mssql-container.

Wróć do okienka Eksplorator . W pliku Pages/Shared/_Layout.cshtml zastąp komentarz @* Add the _LoginPartial partial view *@ następującym kodem.

<partial name="_LoginPartial" />

Poprzedzający znacznik renderuje widok częściowy _LoginPartial w nagłówku dowolnej strony, która używa układu domyślnego. Element _LoginPartial został dodany przez szkielet mechanizmu Identity. Ten widok częściowy wyświetla użytkownikowi linki Log in (Zaloguj) i Register (Zarejestruj), jeśli użytkownik nie jest zalogowany.

Testowanie funkcjonalności tożsamości

To wszystko, co jest wymagane do dodania domyślnej implementacji tożsamości. Nadszedł czas, aby go przetestować!

  1. Upewnij się, że wszystkie zmiany zostały zapisane.

  2. W okienku terminalu skompiluj projekt i uruchom aplikację:

    dotnet run
    
  3. Przejdź do aplikacji w przeglądarce tak jak poprzednio.

  4. Wybierz link Zarejestruj w nagłówku aplikacji. Wypełnij formularz, aby utworzyć nowe konto.

    Zostanie wyświetlona strona Potwierdzenia rejestracji . Ponieważ aplikacja nie została jeszcze skonfigurowana do wysyłania wiadomości e-mail z potwierdzeniem, link potwierdzenia jest udostępniany na tej stronie.

  5. Wybierz link potwierdzenia. Zostanie wyświetlony komunikat z potwierdzeniem.

  6. Wybierz link Zaloguj się w nagłówku aplikacji i zaloguj się.

    Po pomyślnym zalogowaniu:

    • Nastąpi przekierowanie do strony głównej.
    • Nagłówek aplikacji wyświetla ciąg Hello [adres e-mail]! i link wylogowywanie .
    • Tworzony jest plik cookie o nazwie .AspNetCore.Identity.Application. Mechanizm Identity zachowuje sesje użytkownika z uwierzytelnianiem na podstawie plików cookie.
  7. Wybierz link Wylogowywanie w nagłówku aplikacji.

    Po pomyślnym wylogowaniu plik cookie .AspNetCore.Identity.Application zostanie usunięty, aby zakończyć sesję użytkownika.

  8. Naciśnij klawisze Ctrl+C w okienku terminalu, aby zatrzymać aplikację.

Podsumowanie

W tej lekcji dodano domyślną implementację tożsamości do istniejącej aplikacji internetowej. W następnej lekcji dowiesz się więcej na temat rozszerzania i dostosowywania tożsamości.