Szkielet w Identity projektach ASP.NET Core

Autor: Rick Anderson

ASP.NET Core zapewnia ASP.NET Core Identity jako bibliotekę Razorklas. Aplikacje, które obejmują Identity , mogą stosować szkielet, aby selektywnie dodać kod źródłowy zawarty w IdentityRazor bibliotece klas (RCL). Możesz wygenerować kod źródłowy, aby zmodyfikować kod i zmienić zachowanie. Możesz na przykład poinstruować szkielet, aby wygenerował kod użyty w rejestracji. Wygenerowany kod ma pierwszeństwo przed tym samym kodem na liście Identity RCL. Aby uzyskać pełną kontrolę nad interfejsem użytkownika i nie używać domyślnej listy RCL, zobacz sekcję Tworzenie pełnego Identity źródła interfejsu użytkownika.

Aplikacje, które nie zawierają uwierzytelniania, mogą stosować szkielet, aby dodać pakiet listy RCLIdentity. Możesz wybrać Identity kod do wygenerowania.

Mimo że szkielet generuje większość niezbędnego kodu, należy zaktualizować projekt, aby ukończyć proces. W tym dokumencie opisano kroki wymagane do ukończenia Identity aktualizacji szkieletu.

Zalecamy użycie systemu kontroli źródła, który pokazuje różnice w plikach i umożliwia wycofywanie zmian. Sprawdź zmiany po uruchomieniu szkieletu Identity .

Usługi są wymagane w przypadku korzystania z usługi Two Factor Authentication, potwierdzenia konta i odzyskiwania hasła oraz innych funkcji zabezpieczeń z usługą Identity. Wycinki usług lub usługi nie są generowane podczas tworzenia szkieletu Identity. Usługi umożliwiające włączenie tych funkcji należy dodać ręcznie. Na przykład zobacz Wymagaj potwierdzenia wiadomości e-mail.

Zazwyczaj aplikacje utworzone przy użyciu poszczególnych kont nie powinny tworzyć nowego kontekstu danych.

Identity Tworzenie szkieletu w projekcie Razor bez istniejącej autoryzacji

Zainstaluj pakiet NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Uwaga

Aby uzyskać instrukcje dodawania pakietów do aplikacji .NET, zobacz artykuły w sekcji Instalowanie pakietów i zarządzanie nimi w temacie Przepływ pracy użycia pakietów (dokumentacja programu NuGet). Sprawdź prawidłowe wersje pakietów pod adresem NuGet.org.


Identity Uruchom szkielet:

  • W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt >Dodaj>nowy element szkieletowy.
  • W okienku po lewej stronie okna dialogowego Dodawanie nowego elementu szkieletowego wybierz pozycję Identity. Wybierz Identity w środkowym okienku. Kliknij przycisk Dodaj.
  • W oknie dialogowym Dodawanie Identity wybierz żądane opcje.
    • Jeśli masz istniejącą, dostosowaną stronę układu (Identity_Layout.cshtml), wybierz istniejącą stronę układu, aby uniknąć zastępowania układu nieprawidłowym znacznikiem przez szkielet. Na przykład wybierz jedną z następujących opcji:
      • Pages/Shared/_Layout.cshtml w przypadku Razor stron lub Blazor Server projektów z istniejącą Razor infrastrukturą stron.
      • Views/Shared/_Layout.cshtml dla projektów MVC lub Blazor Server projektów z istniejącą infrastrukturą MVC.
    • Dla kontekstu danych (dbContext, klasa):
      • Wybierz klasę kontekstu danych. Aby dodać kontekst danych, musisz wybrać co najmniej jeden plik.
      • Aby utworzyć kontekst danych i ewentualnie utworzyć nową klasę użytkownika dla Identityelementu , wybierz + przycisk . Zaakceptuj wartość domyślną lub określ klasę (na przykład Contoso.Data.ApplicationDbContext dla firmy o nazwie "Contoso"). Aby utworzyć nową klasę użytkownika, wybierz + przycisk Klasa użytkownika i określ klasę (na przykład ContosoUser dla firmy o nazwie "Contoso").
    • Wybierz przycisk Dodaj, aby uruchomić szkielet.

Migracje, używanie uwierzytelniania i układ

Wygenerowany Identity kod bazy danych wymaga migracji platformy Entity Framework Core. Jeśli migracja do utworzenia schematu Identity nie została utworzona i zastosowana do bazy danych, utwórz migrację i zaktualizuj bazę danych. Na przykład uruchom następujące polecenia:

W konsoli programu Visual Studio Menedżer pakietów:

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

Parametr nazwy "UtwórzIdentityschemat" dla Add-Migration polecenia jest dowolny. "CreateIdentitySchema" opisuje migrację.

Identity Jeśli schemat został już utworzony, ale nie został zastosowany do bazy danych, należy wykonać tylko polecenie aktualizacji bazy danych:

W konsoli programu Visual Studio Menedżer pakietów wykonaj polecenie Update-Database:

Update-Database

Możesz potwierdzić zastosowanie schematu Identity za pomocą następującego polecenia. Dane wyjściowe polecenia zawierają kolumnę "applied", aby pokazać, które migracje są stosowane do bazy danych.

W konsoli programu Visual Studio Menedżer pakietów wykonaj polecenie Get-Migration:

Get-Migration

Jeśli istnieje więcej niż jeden kontekst bazy danych, określ kontekst z parametrem -Context .

Zmiany układu

Opcjonalnie: Dodaj częściową nazwę logowania (_LoginPartial) do pliku układu:

<!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>

Tworzenie szkieletu Identity w projekcie z autoryzacją Razor

Zainstaluj pakiet NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Uwaga

Aby uzyskać instrukcje dodawania pakietów do aplikacji .NET, zobacz artykuły w sekcji Instalowanie pakietów i zarządzanie nimi w temacie Przepływ pracy użycia pakietów (dokumentacja programu NuGet). Sprawdź prawidłowe wersje pakietów pod adresem NuGet.org.


Identity Uruchom szkielet:

  • W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt >Dodaj>nowy element szkieletowy.
  • W okienku po lewej stronie okna dialogowego Dodawanie nowego elementu szkieletowego wybierz pozycję Identity. Wybierz Identity w środkowym okienku. Kliknij przycisk Dodaj.
  • W oknie dialogowym Dodawanie Identity wybierz żądane opcje.
    • Jeśli masz istniejącą, dostosowaną stronę układu (Identity_Layout.cshtml), wybierz istniejącą stronę układu, aby uniknąć zastępowania układu nieprawidłowym znacznikiem przez szkielet. Na przykład wybierz jedną z następujących opcji:
      • Pages/Shared/_Layout.cshtml w przypadku Razor stron lub Blazor Server projektów z istniejącą Razor infrastrukturą stron.
      • Views/Shared/_Layout.cshtml dla projektów MVC lub Blazor Server projektów z istniejącą infrastrukturą MVC.
    • Dla kontekstu danych (dbContext, klasa):
      • Wybierz klasę kontekstu danych. Aby dodać kontekst danych, musisz wybrać co najmniej jeden plik.
      • Aby utworzyć kontekst danych i ewentualnie utworzyć nową klasę użytkownika dla Identityelementu , wybierz + przycisk . Zaakceptuj wartość domyślną lub określ klasę (na przykład Contoso.Data.ApplicationDbContext dla firmy o nazwie "Contoso"). Aby utworzyć nową klasę użytkownika, wybierz + przycisk Klasa użytkownika i określ klasę (na przykład ContosoUser dla firmy o nazwie "Contoso").
    • Wybierz przycisk Dodaj, aby uruchomić szkielet.

Tworzenie szkieletu Identity w projekcie MVC bez istniejącej autoryzacji

Zainstaluj pakiet NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Uwaga

Aby uzyskać instrukcje dodawania pakietów do aplikacji .NET, zobacz artykuły w sekcji Instalowanie pakietów i zarządzanie nimi w temacie Przepływ pracy użycia pakietów (dokumentacja programu NuGet). Sprawdź prawidłowe wersje pakietów pod adresem NuGet.org.


Identity Uruchom szkielet:

  • W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt >Dodaj>nowy element szkieletowy.
  • W okienku po lewej stronie okna dialogowego Dodawanie nowego elementu szkieletowego wybierz pozycję Identity. Wybierz Identity w środkowym okienku. Kliknij przycisk Dodaj.
  • W oknie dialogowym Dodawanie Identity wybierz żądane opcje.
    • Jeśli masz istniejącą, dostosowaną stronę układu (Identity_Layout.cshtml), wybierz istniejącą stronę układu, aby uniknąć zastępowania układu nieprawidłowym znacznikiem przez szkielet. Na przykład wybierz jedną z następujących opcji:
      • Pages/Shared/_Layout.cshtml w przypadku Razor stron lub Blazor Server projektów z istniejącą Razor infrastrukturą stron.
      • Views/Shared/_Layout.cshtml dla projektów MVC lub Blazor Server projektów z istniejącą infrastrukturą MVC.
    • Dla kontekstu danych (dbContext, klasa):
      • Wybierz klasę kontekstu danych. Aby dodać kontekst danych, musisz wybrać co najmniej jeden plik.
      • Aby utworzyć kontekst danych i ewentualnie utworzyć nową klasę użytkownika dla Identityelementu , wybierz + przycisk . Zaakceptuj wartość domyślną lub określ klasę (na przykład Contoso.Data.ApplicationDbContext dla firmy o nazwie "Contoso"). Aby utworzyć nową klasę użytkownika, wybierz + przycisk Klasa użytkownika i określ klasę (na przykład ContosoUser dla firmy o nazwie "Contoso").
    • Wybierz przycisk Dodaj, aby uruchomić szkielet.

Opcjonalnie: dodaj element logowania częściowy (_LoginPartial) do Views/Shared/_Layout.cshtml pliku:

<!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>

Wygenerowany Identity kod bazy danych wymaga migracji platformy Entity Framework Core. Jeśli migracja do utworzenia schematu Identity nie została utworzona i zastosowana do bazy danych, utwórz migrację i zaktualizuj bazę danych. Na przykład uruchom następujące polecenia:

W konsoli programu Visual Studio Menedżer pakietów:

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

Parametr nazwy "UtwórzIdentityschemat" dla Add-Migration polecenia jest dowolny. "CreateIdentitySchema" opisuje migrację.

Identity Jeśli schemat został już utworzony, ale nie został zastosowany do bazy danych, należy wykonać tylko polecenie aktualizacji bazy danych:

W konsoli programu Visual Studio Menedżer pakietów wykonaj polecenie Update-Database:

Update-Database

Możesz potwierdzić zastosowanie schematu Identity za pomocą następującego polecenia. Dane wyjściowe polecenia zawierają kolumnę "applied", aby pokazać, które migracje są stosowane do bazy danych.

W konsoli programu Visual Studio Menedżer pakietów wykonaj polecenie Get-Migration:

Get-Migration

Jeśli istnieje więcej niż jeden kontekst bazy danych, określ kontekst z parametrem -Context .

Dodaj MapRazorPages element do Program.cs , jak pokazano w poniższym wyróżnionym kodzie:

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

Tworzenie szkieletu Identity w projekcie MVC z autoryzacją

Zainstaluj pakiet NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Uwaga

Aby uzyskać instrukcje dodawania pakietów do aplikacji .NET, zobacz artykuły w sekcji Instalowanie pakietów i zarządzanie nimi w temacie Przepływ pracy użycia pakietów (dokumentacja programu NuGet). Sprawdź prawidłowe wersje pakietów pod adresem NuGet.org.


Identity Uruchom szkielet:

  • W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt >Dodaj>nowy element szkieletowy.
  • W okienku po lewej stronie okna dialogowego Dodawanie nowego elementu szkieletowego wybierz pozycję Identity. Wybierz Identity w środkowym okienku. Kliknij przycisk Dodaj.
  • W oknie dialogowym Dodawanie Identity wybierz żądane opcje.
    • Jeśli masz istniejącą, dostosowaną stronę układu (Identity_Layout.cshtml), wybierz istniejącą stronę układu, aby uniknąć zastępowania układu nieprawidłowym znacznikiem przez szkielet. Na przykład wybierz jedną z następujących opcji:
      • Pages/Shared/_Layout.cshtml w przypadku Razor stron lub Blazor Server projektów z istniejącą Razor infrastrukturą stron.
      • Views/Shared/_Layout.cshtml dla projektów MVC lub Blazor Server projektów z istniejącą infrastrukturą MVC.
    • Dla kontekstu danych (dbContext, klasa):
      • Wybierz klasę kontekstu danych. Aby dodać kontekst danych, musisz wybrać co najmniej jeden plik.
      • Aby utworzyć kontekst danych i ewentualnie utworzyć nową klasę użytkownika dla Identityelementu , wybierz + przycisk . Zaakceptuj wartość domyślną lub określ klasę (na przykład Contoso.Data.ApplicationDbContext dla firmy o nazwie "Contoso"). Aby utworzyć nową klasę użytkownika, wybierz + przycisk Klasa użytkownika i określ klasę (na przykład ContosoUser dla firmy o nazwie "Contoso").
    • Wybierz przycisk Dodaj, aby uruchomić szkielet.

Aplikacje po stronie Blazor klienta

Aplikacje po stronie Blazor klienta używają własnych Identity metod interfejsu użytkownika i nie mogą używać szkieletu ASP.NET Core Identity .

Aplikacje ASP.NET Core po stronie serwera mogą postępować zgodnie ze Razor wskazówkami dotyczącymi stron/MVC w tym artykule i są skonfigurowane tak samo jak każda inna aplikacja ASP.NET Core, która obsługuje Identityusługę . Platforma Blazor używa Razor wersji składników () stron interfejsu Identity użytkownika (.cshtml.razor) podczas tworzenia Identity szkieletu w Blazor aplikacji internetowej.

Aby uzyskać więcej informacji, zobacz Blazor Zabezpieczenia i Identity artykuły.

Tworzenie pełnego Identity źródła interfejsu użytkownika

Aby zachować pełną kontrolę nad interfejsem Identity użytkownika, uruchom Identity szkielet i wybierz pozycję Przesłoń wszystkie pliki.

Konfiguracja hasła

Jeśli PasswordOptions konfiguracja atrybutu jest skonfigurowana w Startup.ConfigureServicesprogramie , [StringLength] może być wymagana Password dla właściwości na stronach szkieletowych.Identity InputModelPassword właściwości znajdują się w następujących plikach:

  • Areas/Identity/Pages/Account/Register.cshtml.cs
  • Areas/Identity/Pages/Account/ResetPassword.cshtml.cs

Wyłączanie strony

W tej sekcji pokazano, jak wyłączyć stronę rejestrowania, ale podejście może służyć do wyłączania dowolnej strony.

Aby wyłączyć rejestrację użytkownika:

  • IdentitySzkielet . Uwzględnij ciąg Account.Register, Account.Login i Account.RegisterConfirmation. Na przykład:

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  • Zaktualizuj, Areas/Identity/Pages/Account/Register.cshtml.cs aby użytkownicy nie mogli zarejestrować się z tego punktu końcowego:

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • Aktualizuj Areas/Identity/Pages/Account/Register.cshtml , aby zachować spójność z poprzednimi zmianami:

    @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>
    
  • Oznacz jako komentarz lub usuń link rejestracji z Areas/Identity/Pages/Account/Login.cshtml

    @*
    <p>
        <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
    </p>
    *@
    
  • Zaktualizuj stronę Obszary/Identity/Strony/Konto/RegisterConfirmation.

    • Usuń kod i linki z pliku cshtml.
    • Usuń kod potwierdzenia z pliku PageModel:
    [AllowAnonymous]
      public class RegisterConfirmationModel : PageModel
      {
          public IActionResult OnGet()
          {  
              return Page();
          }
      }
    

Dodawanie użytkowników za pomocą innej aplikacji

Podaj mechanizm dodawania użytkowników spoza aplikacji internetowej. Opcje dodawania użytkowników obejmują:

  • Dedykowana aplikacja internetowa dla administratorów.
  • Aplikacja konsolowa.

Poniższy kod przedstawia jedno podejście do dodawania użytkowników:

  • Lista użytkowników jest odczytywana do pamięci.
  • Dla każdego użytkownika jest generowane silne unikatowe hasło.
  • Użytkownik zostanie dodany do Identity bazy danych.
  • Użytkownik jest powiadamiany i powiadamiany o zmianie hasła.
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>();
            });
}

Poniższy kod przedstawia dodawanie użytkownika:


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;
}

Podobne podejście można zastosować w scenariuszach produkcyjnych.

Zapobieganie publikowaniu zasobów statycznych Identity

Aby zapobiec publikowaniu zasobów statycznych Identity w katalogu głównym sieci Web, zobacz Wprowadzenie do Identity ASP.NET Core.

ASP.NET Core zapewnia ASP.NET Core Identity jako bibliotekę Razorklas. Aplikacje, które obejmują Identity , mogą stosować szkielet, aby selektywnie dodać kod źródłowy zawarty w IdentityRazor bibliotece klas (RCL). Możesz wygenerować kod źródłowy, aby zmodyfikować kod i zmienić zachowanie. Możesz na przykład poinstruować szkielet, aby wygenerował kod użyty w rejestracji. Wygenerowany kod ma pierwszeństwo przed tym samym kodem na liście Identity RCL. Aby uzyskać pełną kontrolę nad interfejsem użytkownika i nie używać domyślnej listy RCL, zobacz sekcję Tworzenie pełnego Identity źródła interfejsu użytkownika.

Aplikacje, które nie zawierają uwierzytelniania, mogą stosować szkielet, aby dodać pakiet listy RCLIdentity. Możesz wybrać Identity kod do wygenerowania.

Mimo że szkielet generuje większość niezbędnego kodu, należy zaktualizować projekt, aby ukończyć proces. W tym dokumencie opisano kroki wymagane do ukończenia Identity aktualizacji szkieletu.

Zalecamy użycie systemu kontroli źródła, który pokazuje różnice w plikach i umożliwia wycofywanie zmian. Sprawdź zmiany po uruchomieniu szkieletu Identity .

Usługi są wymagane w przypadku korzystania z usługi Two Factor Authentication, potwierdzenia konta i odzyskiwania hasła oraz innych funkcji zabezpieczeń z usługą Identity. Wycinki usług lub usługi nie są generowane podczas tworzenia szkieletu Identity. Usługi umożliwiające włączenie tych funkcji należy dodać ręcznie. Na przykład zobacz Wymagaj potwierdzenia wiadomości e-mail.

Zazwyczaj aplikacje utworzone przy użyciu poszczególnych kont nie powinny tworzyć nowego kontekstu danych.

Identity Tworzenie szkieletu w projekcie Razor bez istniejącej autoryzacji

Zainstaluj pakiet NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Uwaga

Aby uzyskać instrukcje dodawania pakietów do aplikacji .NET, zobacz artykuły w sekcji Instalowanie pakietów i zarządzanie nimi w temacie Przepływ pracy użycia pakietów (dokumentacja programu NuGet). Sprawdź prawidłowe wersje pakietów pod adresem NuGet.org.


Identity Uruchom szkielet:

  • W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt >Dodaj>nowy element szkieletowy.
  • W okienku po lewej stronie okna dialogowego Dodawanie nowego elementu szkieletowego wybierz pozycję Identity. Wybierz Identity w środkowym okienku. Kliknij przycisk Dodaj.
  • W oknie dialogowym Dodawanie Identity wybierz żądane opcje.
    • Jeśli masz istniejącą, dostosowaną stronę układu (Identity_Layout.cshtml), wybierz istniejącą stronę układu, aby uniknąć zastępowania układu nieprawidłowym znacznikiem przez szkielet. Na przykład wybierz jedną z następujących opcji:
      • Pages/Shared/_Layout.cshtml w przypadku Razor stron lub Blazor Server projektów z istniejącą Razor infrastrukturą stron.
      • Views/Shared/_Layout.cshtml dla projektów MVC lub Blazor Server projektów z istniejącą infrastrukturą MVC.
    • Dla kontekstu danych (dbContext, klasa):
      • Wybierz klasę kontekstu danych. Aby dodać kontekst danych, musisz wybrać co najmniej jeden plik.
      • Aby utworzyć kontekst danych i ewentualnie utworzyć nową klasę użytkownika dla Identityelementu , wybierz + przycisk . Zaakceptuj wartość domyślną lub określ klasę (na przykład Contoso.Data.ApplicationDbContext dla firmy o nazwie "Contoso"). Aby utworzyć nową klasę użytkownika, wybierz + przycisk Klasa użytkownika i określ klasę (na przykład ContosoUser dla firmy o nazwie "Contoso").
    • Wybierz przycisk Dodaj, aby uruchomić szkielet.

Migracje, używanie uwierzytelniania i układ

Wygenerowany Identity kod bazy danych wymaga migracji platformy Entity Framework Core. Jeśli migracja do utworzenia schematu Identity nie została utworzona i zastosowana do bazy danych, utwórz migrację i zaktualizuj bazę danych. Na przykład uruchom następujące polecenia:

W konsoli programu Visual Studio Menedżer pakietów:

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

Parametr nazwy "UtwórzIdentityschemat" dla Add-Migration polecenia jest dowolny. "CreateIdentitySchema" opisuje migrację.

Identity Jeśli schemat został już utworzony, ale nie został zastosowany do bazy danych, należy wykonać tylko polecenie aktualizacji bazy danych:

W konsoli programu Visual Studio Menedżer pakietów wykonaj polecenie Update-Database:

Update-Database

Możesz potwierdzić zastosowanie schematu Identity za pomocą następującego polecenia. Dane wyjściowe polecenia zawierają kolumnę "applied", aby pokazać, które migracje są stosowane do bazy danych.

W konsoli programu Visual Studio Menedżer pakietów wykonaj polecenie Get-Migration:

Get-Migration

Jeśli istnieje więcej niż jeden kontekst bazy danych, określ kontekst z parametrem -Context .

Zmiany układu

Opcjonalnie: Dodaj częściową nazwę logowania (_LoginPartial) do pliku układu:

<!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>

Tworzenie szkieletu Identity w projekcie z autoryzacją Razor

Zainstaluj pakiet NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Uwaga

Aby uzyskać instrukcje dodawania pakietów do aplikacji .NET, zobacz artykuły w sekcji Instalowanie pakietów i zarządzanie nimi w temacie Przepływ pracy użycia pakietów (dokumentacja programu NuGet). Sprawdź prawidłowe wersje pakietów pod adresem NuGet.org.


Identity Uruchom szkielet:

  • W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt >Dodaj>nowy element szkieletowy.
  • W okienku po lewej stronie okna dialogowego Dodawanie nowego elementu szkieletowego wybierz pozycję Identity. Wybierz Identity w środkowym okienku. Kliknij przycisk Dodaj.
  • W oknie dialogowym Dodawanie Identity wybierz żądane opcje.
    • Jeśli masz istniejącą, dostosowaną stronę układu (Identity_Layout.cshtml), wybierz istniejącą stronę układu, aby uniknąć zastępowania układu nieprawidłowym znacznikiem przez szkielet. Na przykład wybierz jedną z następujących opcji:
      • Pages/Shared/_Layout.cshtml w przypadku Razor stron lub Blazor Server projektów z istniejącą Razor infrastrukturą stron.
      • Views/Shared/_Layout.cshtml dla projektów MVC lub Blazor Server projektów z istniejącą infrastrukturą MVC.
    • Dla kontekstu danych (dbContext, klasa):
      • Wybierz klasę kontekstu danych. Aby dodać kontekst danych, musisz wybrać co najmniej jeden plik.
      • Aby utworzyć kontekst danych i ewentualnie utworzyć nową klasę użytkownika dla Identityelementu , wybierz + przycisk . Zaakceptuj wartość domyślną lub określ klasę (na przykład Contoso.Data.ApplicationDbContext dla firmy o nazwie "Contoso"). Aby utworzyć nową klasę użytkownika, wybierz + przycisk Klasa użytkownika i określ klasę (na przykład ContosoUser dla firmy o nazwie "Contoso").
    • Wybierz przycisk Dodaj, aby uruchomić szkielet.

Tworzenie szkieletu Identity w projekcie MVC bez istniejącej autoryzacji

Zainstaluj pakiet NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Uwaga

Aby uzyskać instrukcje dodawania pakietów do aplikacji .NET, zobacz artykuły w sekcji Instalowanie pakietów i zarządzanie nimi w temacie Przepływ pracy użycia pakietów (dokumentacja programu NuGet). Sprawdź prawidłowe wersje pakietów pod adresem NuGet.org.


Identity Uruchom szkielet:

  • W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt >Dodaj>nowy element szkieletowy.
  • W okienku po lewej stronie okna dialogowego Dodawanie nowego elementu szkieletowego wybierz pozycję Identity. Wybierz Identity w środkowym okienku. Kliknij przycisk Dodaj.
  • W oknie dialogowym Dodawanie Identity wybierz żądane opcje.
    • Jeśli masz istniejącą, dostosowaną stronę układu (Identity_Layout.cshtml), wybierz istniejącą stronę układu, aby uniknąć zastępowania układu nieprawidłowym znacznikiem przez szkielet. Na przykład wybierz jedną z następujących opcji:
      • Pages/Shared/_Layout.cshtml w przypadku Razor stron lub Blazor Server projektów z istniejącą Razor infrastrukturą stron.
      • Views/Shared/_Layout.cshtml dla projektów MVC lub Blazor Server projektów z istniejącą infrastrukturą MVC.
    • Dla kontekstu danych (dbContext, klasa):
      • Wybierz klasę kontekstu danych. Aby dodać kontekst danych, musisz wybrać co najmniej jeden plik.
      • Aby utworzyć kontekst danych i ewentualnie utworzyć nową klasę użytkownika dla Identityelementu , wybierz + przycisk . Zaakceptuj wartość domyślną lub określ klasę (na przykład Contoso.Data.ApplicationDbContext dla firmy o nazwie "Contoso"). Aby utworzyć nową klasę użytkownika, wybierz + przycisk Klasa użytkownika i określ klasę (na przykład ContosoUser dla firmy o nazwie "Contoso").
    • Wybierz przycisk Dodaj, aby uruchomić szkielet.

Opcjonalnie: dodaj element logowania częściowy (_LoginPartial) do Views/Shared/_Layout.cshtml pliku:

<!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>

Wygenerowany Identity kod bazy danych wymaga migracji platformy Entity Framework Core. Jeśli migracja do utworzenia schematu Identity nie została utworzona i zastosowana do bazy danych, utwórz migrację i zaktualizuj bazę danych. Na przykład uruchom następujące polecenia:

W konsoli programu Visual Studio Menedżer pakietów:

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

Parametr nazwy "UtwórzIdentityschemat" dla Add-Migration polecenia jest dowolny. "CreateIdentitySchema" opisuje migrację.

Identity Jeśli schemat został już utworzony, ale nie został zastosowany do bazy danych, należy wykonać tylko polecenie aktualizacji bazy danych:

W konsoli programu Visual Studio Menedżer pakietów wykonaj polecenie Update-Database:

Update-Database

Możesz potwierdzić zastosowanie schematu Identity za pomocą następującego polecenia. Dane wyjściowe polecenia zawierają kolumnę "applied", aby pokazać, które migracje są stosowane do bazy danych.

W konsoli programu Visual Studio Menedżer pakietów wykonaj polecenie Get-Migration:

Get-Migration

Jeśli istnieje więcej niż jeden kontekst bazy danych, określ kontekst z parametrem -Context .

Dodaj MapRazorPages element do Program.cs , jak pokazano w poniższym wyróżnionym kodzie:

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

Tworzenie szkieletu Identity w projekcie MVC z autoryzacją

Zainstaluj pakiet NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Uwaga

Aby uzyskać instrukcje dodawania pakietów do aplikacji .NET, zobacz artykuły w sekcji Instalowanie pakietów i zarządzanie nimi w temacie Przepływ pracy użycia pakietów (dokumentacja programu NuGet). Sprawdź prawidłowe wersje pakietów pod adresem NuGet.org.


Identity Uruchom szkielet:

  • W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt >Dodaj>nowy element szkieletowy.
  • W okienku po lewej stronie okna dialogowego Dodawanie nowego elementu szkieletowego wybierz pozycję Identity. Wybierz Identity w środkowym okienku. Kliknij przycisk Dodaj.
  • W oknie dialogowym Dodawanie Identity wybierz żądane opcje.
    • Jeśli masz istniejącą, dostosowaną stronę układu (Identity_Layout.cshtml), wybierz istniejącą stronę układu, aby uniknąć zastępowania układu nieprawidłowym znacznikiem przez szkielet. Na przykład wybierz jedną z następujących opcji:
      • Pages/Shared/_Layout.cshtml w przypadku Razor stron lub Blazor Server projektów z istniejącą Razor infrastrukturą stron.
      • Views/Shared/_Layout.cshtml dla projektów MVC lub Blazor Server projektów z istniejącą infrastrukturą MVC.
    • Dla kontekstu danych (dbContext, klasa):
      • Wybierz klasę kontekstu danych. Aby dodać kontekst danych, musisz wybrać co najmniej jeden plik.
      • Aby utworzyć kontekst danych i ewentualnie utworzyć nową klasę użytkownika dla Identityelementu , wybierz + przycisk . Zaakceptuj wartość domyślną lub określ klasę (na przykład Contoso.Data.ApplicationDbContext dla firmy o nazwie "Contoso"). Aby utworzyć nową klasę użytkownika, wybierz + przycisk Klasa użytkownika i określ klasę (na przykład ContosoUser dla firmy o nazwie "Contoso").
    • Wybierz przycisk Dodaj, aby uruchomić szkielet.

Tworzenie szkieletu Identity w aplikacji po stronie Blazor serwera z autoryzacją

Zainstaluj pakiet NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Uwaga

Aby uzyskać instrukcje dodawania pakietów do aplikacji .NET, zobacz artykuły w sekcji Instalowanie pakietów i zarządzanie nimi w temacie Przepływ pracy użycia pakietów (dokumentacja programu NuGet). Sprawdź prawidłowe wersje pakietów pod adresem NuGet.org.


Identity Uruchom szkielet:

  • W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt >Dodaj>nowy element szkieletowy.
  • W okienku po lewej stronie okna dialogowego Dodawanie nowego elementu szkieletowego wybierz pozycję Identity. Wybierz Identity w środkowym okienku. Kliknij przycisk Dodaj.
  • W oknie dialogowym Dodawanie Identity wybierz żądane opcje.
    • Jeśli masz istniejącą, dostosowaną stronę układu (Identity_Layout.cshtml), wybierz istniejącą stronę układu, aby uniknąć zastępowania układu nieprawidłowym znacznikiem przez szkielet. Na przykład wybierz jedną z następujących opcji:
      • Pages/Shared/_Layout.cshtml w przypadku Razor stron lub Blazor Server projektów z istniejącą Razor infrastrukturą stron.
      • Views/Shared/_Layout.cshtml dla projektów MVC lub Blazor Server projektów z istniejącą infrastrukturą MVC.
    • Dla kontekstu danych (dbContext, klasa):
      • Wybierz klasę kontekstu danych. Aby dodać kontekst danych, musisz wybrać co najmniej jeden plik.
      • Aby utworzyć kontekst danych i ewentualnie utworzyć nową klasę użytkownika dla Identityelementu , wybierz + przycisk . Zaakceptuj wartość domyślną lub określ klasę (na przykład Contoso.Data.ApplicationDbContext dla firmy o nazwie "Contoso"). Aby utworzyć nową klasę użytkownika, wybierz + przycisk Klasa użytkownika i określ klasę (na przykład ContosoUser dla firmy o nazwie "Contoso").
    • Wybierz przycisk Dodaj, aby uruchomić szkielet.

Migracje

Wygenerowany Identity kod bazy danych wymaga migracji platformy Entity Framework Core. Jeśli migracja do utworzenia schematu Identity nie została utworzona i zastosowana do bazy danych, utwórz migrację i zaktualizuj bazę danych. Na przykład uruchom następujące polecenia:

W konsoli programu Visual Studio Menedżer pakietów:

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

Parametr nazwy "UtwórzIdentityschemat" dla Add-Migration polecenia jest dowolny. "CreateIdentitySchema" opisuje migrację.

Identity Jeśli schemat został już utworzony, ale nie został zastosowany do bazy danych, należy wykonać tylko polecenie aktualizacji bazy danych:

W konsoli programu Visual Studio Menedżer pakietów wykonaj polecenie Update-Database:

Update-Database

Możesz potwierdzić zastosowanie schematu Identity za pomocą następującego polecenia. Dane wyjściowe polecenia zawierają kolumnę "applied", aby pokazać, które migracje są stosowane do bazy danych.

W konsoli programu Visual Studio Menedżer pakietów wykonaj polecenie Get-Migration:

Get-Migration

Jeśli istnieje więcej niż jeden kontekst bazy danych, określ kontekst z parametrem -Context .

Punkty końcowe uwierzytelniania stylu

Ponieważ aplikacje po stronie Blazor serwera używają Razor stron Stron Identity , styl interfejsu użytkownika zmienia się, gdy odwiedzający przechodzi między stronami Identity i składnikami. Dostępne są dwie opcje rozwiązywania problemów z nieskontennymi stylami:

Składniki niestandardowe Identity

ASP.NET Core Identity jest przeznaczony do pracy w kontekście komunikacji żądań HTTP i odpowiedzi, która nie jest podstawowym modelem komunikacji klient-serwer w Blazor aplikacjach. Aplikacje ASP.NET Core korzystające z produktu ASP.NET Core Identity do zarządzania użytkownikami powinny używać rozwiązania Razor Pages, a nie składników Razor, do obsługi interfejsu użytkownika związanego z Identity, na przykład rejestracji użytkowników, logowania i wylogowywania oraz innych zadań związanych z zarządzaniem użytkownikami.

Ponieważ SignInManager<TUser> i UserManager<TUser> nie są obsługiwane w Razor składnikach, zalecamy używanie internetowego interfejsu API do zarządzania akcjami Identity ze Razor składników za pośrednictwem aplikacji ASP.NET Core z obsługą po stronie Identityserwera. Aby uzyskać wskazówki dotyczące tworzenia internetowych interfejsów API dla Blazor aplikacji, zobacz Wywoływanie internetowego interfejsu API z aplikacji ASP.NET CoreBlazor.

Podejście do używania Razor składników Identity zamiast stron polega na tworzeniu Razor własnych składników niestandardowych IdentityRazor , ale firma Microsoft nie zaleca ani nie obsługuje podejścia. Aby uzyskać dodatkowy kontekst, zapoznaj się z następującymi dyskusjami. W poniższych dyskusjach przykłady kodu w komentarzach i przykładach kodu połączonych między repozytoriami microsoft GitHub nie są obsługiwane przez firmę Microsoft, ale mogą być przydatne dla niektórych deweloperów:

Aby uzyskać dodatkową pomoc podczas tworzenia składników niestandardowych IdentityRazor lub wyszukiwania składników innych firm Razor , zalecamy następujące zasoby:

Używanie niestandardowego układu ze stylami Blazor aplikacji

Układ Identity i style stron można modyfikować w celu tworzenia stron, które używają stylów podobnych do motywu domyślnego Blazor . Takie podejście nie jest objęte dokumentacją.

Aplikacje po stronie Blazor klienta

Aplikacje po stronie Blazor klienta używają własnych Identity metod interfejsu użytkownika i nie mogą używać szkieletu ASP.NET Core Identity . Aplikacje Blazor hostowane po stronie serwera ASP.NET Core mogą postępować zgodnie Razor ze wskazówkami dotyczącymi stron/MVC w tym artykule i są skonfigurowane tak samo jak każda inna aplikacja ASP.NET Core, która obsługuje Identityusługę .

Struktura Blazor nie zawiera Razor wersji składników stron interfejsu Identity użytkownika. Identity Składniki interfejsu użytkownika Razor mogą być niestandardowe lub uzyskiwane z nieobsługiwanych źródeł innych firm.

Aby uzyskać więcej informacji, zobacz Blazor Zabezpieczenia i Identity artykuły.

Tworzenie pełnego Identity źródła interfejsu użytkownika

Aby zachować pełną kontrolę nad interfejsem Identity użytkownika, uruchom Identity szkielet i wybierz pozycję Przesłoń wszystkie pliki.

Konfiguracja hasła

Jeśli PasswordOptions konfiguracja atrybutu jest skonfigurowana w Startup.ConfigureServicesprogramie , [StringLength] może być wymagana Password dla właściwości na stronach szkieletowych.Identity InputModelPassword właściwości znajdują się w następujących plikach:

  • Areas/Identity/Pages/Account/Register.cshtml.cs
  • Areas/Identity/Pages/Account/ResetPassword.cshtml.cs

Wyłączanie strony

W tej sekcji pokazano, jak wyłączyć stronę rejestrowania, ale podejście może służyć do wyłączania dowolnej strony.

Aby wyłączyć rejestrację użytkownika:

  • IdentitySzkielet . Uwzględnij ciąg Account.Register, Account.Login i Account.RegisterConfirmation. Na przykład:

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  • Zaktualizuj, Areas/Identity/Pages/Account/Register.cshtml.cs aby użytkownicy nie mogli zarejestrować się z tego punktu końcowego:

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • Aktualizuj Areas/Identity/Pages/Account/Register.cshtml , aby zachować spójność z poprzednimi zmianami:

    @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>
    
  • Oznacz jako komentarz lub usuń link rejestracji z Areas/Identity/Pages/Account/Login.cshtml

    @*
    <p>
        <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
    </p>
    *@
    
  • Zaktualizuj stronę Obszary/Identity/Strony/Konto/RegisterConfirmation.

    • Usuń kod i linki z pliku cshtml.
    • Usuń kod potwierdzenia z pliku PageModel:
    [AllowAnonymous]
      public class RegisterConfirmationModel : PageModel
      {
          public IActionResult OnGet()
          {  
              return Page();
          }
      }
    

Dodawanie użytkowników za pomocą innej aplikacji

Podaj mechanizm dodawania użytkowników spoza aplikacji internetowej. Opcje dodawania użytkowników obejmują:

  • Dedykowana aplikacja internetowa dla administratorów.
  • Aplikacja konsolowa.

Poniższy kod przedstawia jedno podejście do dodawania użytkowników:

  • Lista użytkowników jest odczytywana do pamięci.
  • Dla każdego użytkownika jest generowane silne unikatowe hasło.
  • Użytkownik zostanie dodany do Identity bazy danych.
  • Użytkownik jest powiadamiany i powiadamiany o zmianie hasła.
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>();
            });
}

Poniższy kod przedstawia dodawanie użytkownika:


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;
}

Podobne podejście można zastosować w scenariuszach produkcyjnych.

Zapobieganie publikowaniu zasobów statycznych Identity

Aby zapobiec publikowaniu zasobów statycznych Identity w katalogu głównym sieci Web, zobacz Wprowadzenie do Identity ASP.NET Core.

ASP.NET Core zapewnia ASP.NET Core Identity jako bibliotekę Razorklas. Aplikacje, które obejmują Identity , mogą stosować szkielet, aby selektywnie dodać kod źródłowy zawarty w IdentityRazor bibliotece klas (RCL). Możesz wygenerować kod źródłowy, aby zmodyfikować kod i zmienić zachowanie. Możesz na przykład poinstruować szkielet, aby wygenerował kod użyty w rejestracji. Wygenerowany kod ma pierwszeństwo przed tym samym kodem na liście Identity RCL. Aby uzyskać pełną kontrolę nad interfejsem użytkownika i nie używać domyślnej listy RCL, zobacz sekcję Tworzenie pełnego Identity źródła interfejsu użytkownika.

Aplikacje, które nie zawierają uwierzytelniania, mogą stosować szkielet, aby dodać pakiet listy RCLIdentity. Możesz wybrać Identity kod do wygenerowania.

Mimo że szkielet generuje większość niezbędnego kodu, należy zaktualizować projekt, aby ukończyć proces. W tym dokumencie opisano kroki wymagane do ukończenia Identity aktualizacji szkieletu.

Zalecamy użycie systemu kontroli źródła, który pokazuje różnice w plikach i umożliwia wycofywanie zmian. Sprawdź zmiany po uruchomieniu szkieletu Identity .

Usługi są wymagane w przypadku korzystania z usługi Two Factor Authentication, potwierdzenia konta i odzyskiwania hasła oraz innych funkcji zabezpieczeń z usługą Identity. Wycinki usług lub usługi nie są generowane podczas tworzenia szkieletu Identity. Usługi umożliwiające włączenie tych funkcji należy dodać ręcznie. Na przykład zobacz Wymagaj potwierdzenia wiadomości e-mail.

Podczas tworzenia Identity szkieletu z nowym kontekstem danych w projekcie z istniejącymi kontami indywidualnymi:

  • W Startup.ConfigureServicespliku usuń wywołania do:
    • AddDbContext
    • AddDefaultIdentity

Na przykład AddDbContext i AddDefaultIdentity są komentowane w następującym kodzie:

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();
}

Powyższy kod dodaje komentarze do kodu, który jest zduplikowany w Areas/Identity/IdentityHostingStartup.cs

Zazwyczaj aplikacje utworzone przy użyciu poszczególnych kont nie powinny tworzyć nowego kontekstu danych.

Tworzenie szkieletu Identity w pustym projekcie

Identity Uruchom szkielet:

  • W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt >Dodaj>nowy element szkieletowy.
  • W okienku po lewej stronie okna dialogowego Dodawanie nowego elementu szkieletowego wybierz pozycję Identity. Wybierz Identity w środkowym okienku. Kliknij przycisk Dodaj.
  • W oknie dialogowym Dodawanie Identity wybierz żądane opcje.
    • Jeśli masz istniejącą, dostosowaną stronę układu (Identity_Layout.cshtml), wybierz istniejącą stronę układu, aby uniknąć zastępowania układu nieprawidłowym znacznikiem przez szkielet. Na przykład wybierz jedną z następujących opcji:
      • Pages/Shared/_Layout.cshtml w przypadku Razor stron lub Blazor Server projektów z istniejącą Razor infrastrukturą stron.
      • Views/Shared/_Layout.cshtml dla projektów MVC lub Blazor Server projektów z istniejącą infrastrukturą MVC.
    • Dla kontekstu danych (dbContext, klasa):
      • Wybierz klasę kontekstu danych. Aby dodać kontekst danych, musisz wybrać co najmniej jeden plik.
      • Aby utworzyć kontekst danych i ewentualnie utworzyć nową klasę użytkownika dla Identityelementu , wybierz + przycisk . Zaakceptuj wartość domyślną lub określ klasę (na przykład Contoso.Data.ApplicationDbContext dla firmy o nazwie "Contoso"). Aby utworzyć nową klasę użytkownika, wybierz + przycisk Klasa użytkownika i określ klasę (na przykład ContosoUser dla firmy o nazwie "Contoso").
    • Wybierz przycisk Dodaj, aby uruchomić szkielet.

Zaktualizuj klasę przy Startup użyciu kodu podobnego do następującego:

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 jest zalecana, ale nie jest wymagana. Aby uzyskać więcej informacji, zobacz PROTOKÓŁ HTTP Strict Transport Security Protocol.

Wygenerowany Identity kod bazy danych wymaga migracji platformy Entity Framework Core. Jeśli migracja do utworzenia schematu Identity nie została utworzona i zastosowana do bazy danych, utwórz migrację i zaktualizuj bazę danych. Na przykład uruchom następujące polecenia:

W konsoli programu Visual Studio Menedżer pakietów:

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

Parametr nazwy "UtwórzIdentityschemat" dla Add-Migration polecenia jest dowolny. "CreateIdentitySchema" opisuje migrację.

Identity Jeśli schemat został już utworzony, ale nie został zastosowany do bazy danych, należy wykonać tylko polecenie aktualizacji bazy danych:

W konsoli programu Visual Studio Menedżer pakietów wykonaj polecenie Update-Database:

Update-Database

Możesz potwierdzić zastosowanie schematu Identity za pomocą następującego polecenia. Dane wyjściowe polecenia zawierają kolumnę "applied", aby pokazać, które migracje są stosowane do bazy danych.

W konsoli programu Visual Studio Menedżer pakietów wykonaj polecenie Get-Migration:

Get-Migration

Jeśli istnieje więcej niż jeden kontekst bazy danych, określ kontekst z parametrem -Context .

Identity Tworzenie szkieletu w projekcie Razor bez istniejącej autoryzacji

Identity Uruchom szkielet:

  • W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt >Dodaj>nowy element szkieletowy.
  • W okienku po lewej stronie okna dialogowego Dodawanie nowego elementu szkieletowego wybierz pozycję Identity. Wybierz Identity w środkowym okienku. Kliknij przycisk Dodaj.
  • W oknie dialogowym Dodawanie Identity wybierz żądane opcje.
    • Jeśli masz istniejącą, dostosowaną stronę układu (Identity_Layout.cshtml), wybierz istniejącą stronę układu, aby uniknąć zastępowania układu nieprawidłowym znacznikiem przez szkielet. Na przykład wybierz jedną z następujących opcji:
      • Pages/Shared/_Layout.cshtml w przypadku Razor stron lub Blazor Server projektów z istniejącą Razor infrastrukturą stron.
      • Views/Shared/_Layout.cshtml dla projektów MVC lub Blazor Server projektów z istniejącą infrastrukturą MVC.
    • Dla kontekstu danych (dbContext, klasa):
      • Wybierz klasę kontekstu danych. Aby dodać kontekst danych, musisz wybrać co najmniej jeden plik.
      • Aby utworzyć kontekst danych i ewentualnie utworzyć nową klasę użytkownika dla Identityelementu , wybierz + przycisk . Zaakceptuj wartość domyślną lub określ klasę (na przykład Contoso.Data.ApplicationDbContext dla firmy o nazwie "Contoso"). Aby utworzyć nową klasę użytkownika, wybierz + przycisk Klasa użytkownika i określ klasę (na przykład ContosoUser dla firmy o nazwie "Contoso").
    • Wybierz przycisk Dodaj, aby uruchomić szkielet.

Identity program jest skonfigurowany w programie Areas/Identity/IdentityHostingStartup.cs. Aby uzyskać więcej informacji, zobacz IHostingStartup.

Migracje, używanie uwierzytelniania i układ

Wygenerowany Identity kod bazy danych wymaga migracji platformy Entity Framework Core. Jeśli migracja do utworzenia schematu Identity nie została utworzona i zastosowana do bazy danych, utwórz migrację i zaktualizuj bazę danych. Na przykład uruchom następujące polecenia:

W konsoli programu Visual Studio Menedżer pakietów:

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

Parametr nazwy "UtwórzIdentityschemat" dla Add-Migration polecenia jest dowolny. "CreateIdentitySchema" opisuje migrację.

Identity Jeśli schemat został już utworzony, ale nie został zastosowany do bazy danych, należy wykonać tylko polecenie aktualizacji bazy danych:

W konsoli programu Visual Studio Menedżer pakietów wykonaj polecenie Update-Database:

Update-Database

Możesz potwierdzić zastosowanie schematu Identity za pomocą następującego polecenia. Dane wyjściowe polecenia zawierają kolumnę "applied", aby pokazać, które migracje są stosowane do bazy danych.

W konsoli programu Visual Studio Menedżer pakietów wykonaj polecenie Get-Migration:

Get-Migration

Jeśli istnieje więcej niż jeden kontekst bazy danych, określ kontekst z parametrem -Context .

Włącz uwierzytelnianie

Zaktualizuj klasę przy Startup użyciu kodu podobnego do następującego:

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 jest zalecana, ale nie jest wymagana. Aby uzyskać więcej informacji, zobacz PROTOKÓŁ HTTP Strict Transport Security Protocol.

Zmiany układu

Opcjonalnie: Dodaj częściową nazwę logowania (_LoginPartial) do pliku układu:

<!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>

Tworzenie szkieletu Identity w projekcie z autoryzacją Razor

Identity Uruchom szkielet:

  • W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt >Dodaj>nowy element szkieletowy.
  • W okienku po lewej stronie okna dialogowego Dodawanie nowego elementu szkieletowego wybierz pozycję Identity. Wybierz Identity w środkowym okienku. Kliknij przycisk Dodaj.
  • W oknie dialogowym Dodawanie Identity wybierz żądane opcje.
    • Jeśli masz istniejącą, dostosowaną stronę układu (Identity_Layout.cshtml), wybierz istniejącą stronę układu, aby uniknąć zastępowania układu nieprawidłowym znacznikiem przez szkielet. Na przykład wybierz jedną z następujących opcji:
      • Pages/Shared/_Layout.cshtml w przypadku Razor stron lub Blazor Server projektów z istniejącą Razor infrastrukturą stron.
      • Views/Shared/_Layout.cshtml dla projektów MVC lub Blazor Server projektów z istniejącą infrastrukturą MVC.
    • Dla kontekstu danych (dbContext, klasa):
      • Wybierz klasę kontekstu danych. Aby dodać kontekst danych, musisz wybrać co najmniej jeden plik.
      • Aby utworzyć kontekst danych i ewentualnie utworzyć nową klasę użytkownika dla Identityelementu , wybierz + przycisk . Zaakceptuj wartość domyślną lub określ klasę (na przykład Contoso.Data.ApplicationDbContext dla firmy o nazwie "Contoso"). Aby utworzyć nową klasę użytkownika, wybierz + przycisk Klasa użytkownika i określ klasę (na przykład ContosoUser dla firmy o nazwie "Contoso").
    • Wybierz przycisk Dodaj, aby uruchomić szkielet.

Niektóre Identity opcje są konfigurowane w programie Areas/Identity/IdentityHostingStartup.cs. Aby uzyskać więcej informacji, zobacz IHostingStartup.

Tworzenie szkieletu Identity w projekcie MVC bez istniejącej autoryzacji

Identity Uruchom szkielet:

  • W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt >Dodaj>nowy element szkieletowy.
  • W okienku po lewej stronie okna dialogowego Dodawanie nowego elementu szkieletowego wybierz pozycję Identity. Wybierz Identity w środkowym okienku. Kliknij przycisk Dodaj.
  • W oknie dialogowym Dodawanie Identity wybierz żądane opcje.
    • Jeśli masz istniejącą, dostosowaną stronę układu (Identity_Layout.cshtml), wybierz istniejącą stronę układu, aby uniknąć zastępowania układu nieprawidłowym znacznikiem przez szkielet. Na przykład wybierz jedną z następujących opcji:
      • Pages/Shared/_Layout.cshtml w przypadku Razor stron lub Blazor Server projektów z istniejącą Razor infrastrukturą stron.
      • Views/Shared/_Layout.cshtml dla projektów MVC lub Blazor Server projektów z istniejącą infrastrukturą MVC.
    • Dla kontekstu danych (dbContext, klasa):
      • Wybierz klasę kontekstu danych. Aby dodać kontekst danych, musisz wybrać co najmniej jeden plik.
      • Aby utworzyć kontekst danych i ewentualnie utworzyć nową klasę użytkownika dla Identityelementu , wybierz + przycisk . Zaakceptuj wartość domyślną lub określ klasę (na przykład Contoso.Data.ApplicationDbContext dla firmy o nazwie "Contoso"). Aby utworzyć nową klasę użytkownika, wybierz + przycisk Klasa użytkownika i określ klasę (na przykład ContosoUser dla firmy o nazwie "Contoso").
    • Wybierz przycisk Dodaj, aby uruchomić szkielet.

Opcjonalnie: dodaj element logowania częściowy (_LoginPartial) do Views/Shared/_Layout.cshtml pliku:

<!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.cshtml Przenieś plik doViews/Shared/_LoginPartial.cshtml

Identity program jest skonfigurowany w programie Areas/Identity/IdentityHostingStartup.cs. Aby uzyskać więcej informacji, zobacz IHostingStartup.

Wygenerowany Identity kod bazy danych wymaga migracji platformy Entity Framework Core. Jeśli migracja do utworzenia schematu Identity nie została utworzona i zastosowana do bazy danych, utwórz migrację i zaktualizuj bazę danych. Na przykład uruchom następujące polecenia:

W konsoli programu Visual Studio Menedżer pakietów:

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

Parametr nazwy "UtwórzIdentityschemat" dla Add-Migration polecenia jest dowolny. "CreateIdentitySchema" opisuje migrację.

Identity Jeśli schemat został już utworzony, ale nie został zastosowany do bazy danych, należy wykonać tylko polecenie aktualizacji bazy danych:

W konsoli programu Visual Studio Menedżer pakietów wykonaj polecenie Update-Database:

Update-Database

Możesz potwierdzić zastosowanie schematu Identity za pomocą następującego polecenia. Dane wyjściowe polecenia zawierają kolumnę "applied", aby pokazać, które migracje są stosowane do bazy danych.

W konsoli programu Visual Studio Menedżer pakietów wykonaj polecenie Get-Migration:

Get-Migration

Jeśli istnieje więcej niż jeden kontekst bazy danych, określ kontekst z parametrem -Context .

Zaktualizuj klasę przy Startup użyciu kodu podobnego do następującego:

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 jest zalecana, ale nie jest wymagana. Aby uzyskać więcej informacji, zobacz PROTOKÓŁ HTTP Strict Transport Security Protocol.

Tworzenie szkieletu Identity w projekcie MVC z autoryzacją

Identity Uruchom szkielet:

  • W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt >Dodaj>nowy element szkieletowy.
  • W okienku po lewej stronie okna dialogowego Dodawanie nowego elementu szkieletowego wybierz pozycję Identity. Wybierz Identity w środkowym okienku. Kliknij przycisk Dodaj.
  • W oknie dialogowym Dodawanie Identity wybierz żądane opcje.
    • Jeśli masz istniejącą, dostosowaną stronę układu (Identity_Layout.cshtml), wybierz istniejącą stronę układu, aby uniknąć zastępowania układu nieprawidłowym znacznikiem przez szkielet. Na przykład wybierz jedną z następujących opcji:
      • Pages/Shared/_Layout.cshtml w przypadku Razor stron lub Blazor Server projektów z istniejącą Razor infrastrukturą stron.
      • Views/Shared/_Layout.cshtml dla projektów MVC lub Blazor Server projektów z istniejącą infrastrukturą MVC.
    • Dla kontekstu danych (dbContext, klasa):
      • Wybierz klasę kontekstu danych. Aby dodać kontekst danych, musisz wybrać co najmniej jeden plik.
      • Aby utworzyć kontekst danych i ewentualnie utworzyć nową klasę użytkownika dla Identityelementu , wybierz + przycisk . Zaakceptuj wartość domyślną lub określ klasę (na przykład Contoso.Data.ApplicationDbContext dla firmy o nazwie "Contoso"). Aby utworzyć nową klasę użytkownika, wybierz + przycisk Klasa użytkownika i określ klasę (na przykład ContosoUser dla firmy o nazwie "Contoso").
    • Wybierz przycisk Dodaj, aby uruchomić szkielet.

Tworzenie szkieletu Identity w aplikacji po stronie Blazor serwera bez istniejącej autoryzacji

Identity Uruchom szkielet:

  • W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt >Dodaj>nowy element szkieletowy.
  • W okienku po lewej stronie okna dialogowego Dodawanie nowego elementu szkieletowego wybierz pozycję Identity. Wybierz Identity w środkowym okienku. Kliknij przycisk Dodaj.
  • W oknie dialogowym Dodawanie Identity wybierz żądane opcje.
    • Jeśli masz istniejącą, dostosowaną stronę układu (Identity_Layout.cshtml), wybierz istniejącą stronę układu, aby uniknąć zastępowania układu nieprawidłowym znacznikiem przez szkielet. Na przykład wybierz jedną z następujących opcji:
      • Pages/Shared/_Layout.cshtml w przypadku Razor stron lub Blazor Server projektów z istniejącą Razor infrastrukturą stron.
      • Views/Shared/_Layout.cshtml dla projektów MVC lub Blazor Server projektów z istniejącą infrastrukturą MVC.
    • Dla kontekstu danych (dbContext, klasa):
      • Wybierz klasę kontekstu danych. Aby dodać kontekst danych, musisz wybrać co najmniej jeden plik.
      • Aby utworzyć kontekst danych i ewentualnie utworzyć nową klasę użytkownika dla Identityelementu , wybierz + przycisk . Zaakceptuj wartość domyślną lub określ klasę (na przykład Contoso.Data.ApplicationDbContext dla firmy o nazwie "Contoso"). Aby utworzyć nową klasę użytkownika, wybierz + przycisk Klasa użytkownika i określ klasę (na przykład ContosoUser dla firmy o nazwie "Contoso").
    • Wybierz przycisk Dodaj, aby uruchomić szkielet.

Identity program jest skonfigurowany w programie Areas/Identity/IdentityHostingStartup.cs. W celu uzyskania więcej informacji, zobacz następujący temat: IHostingStartup.

Migracje

Wygenerowany Identity kod bazy danych wymaga migracji platformy Entity Framework Core. Jeśli migracja do utworzenia schematu Identity nie została utworzona i zastosowana do bazy danych, utwórz migrację i zaktualizuj bazę danych. Na przykład uruchom następujące polecenia:

W konsoli programu Visual Studio Menedżer pakietów:

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

Parametr nazwy "UtwórzIdentityschemat" dla Add-Migration polecenia jest dowolny. "CreateIdentitySchema" opisuje migrację.

Identity Jeśli schemat został już utworzony, ale nie został zastosowany do bazy danych, należy wykonać tylko polecenie aktualizacji bazy danych:

W konsoli programu Visual Studio Menedżer pakietów wykonaj polecenie Update-Database:

Update-Database

Możesz potwierdzić zastosowanie schematu Identity za pomocą następującego polecenia. Dane wyjściowe polecenia zawierają kolumnę "applied", aby pokazać, które migracje są stosowane do bazy danych.

W konsoli programu Visual Studio Menedżer pakietów wykonaj polecenie Get-Migration:

Get-Migration

Jeśli istnieje więcej niż jeden kontekst bazy danych, określ kontekst z parametrem -Context .

Punkty końcowe uwierzytelniania stylu

Ponieważ aplikacje po stronie Blazor serwera używają Razor stron Stron Identity , styl interfejsu użytkownika zmienia się, gdy odwiedzający przechodzi między stronami Identity i składnikami. Dostępne są dwie opcje rozwiązywania problemów z nieskontennymi stylami:

Składniki niestandardowe Identity

Podejściem do używania składników Identity zamiast stron jest kompilowanie Identity składników. Ponieważ SignInManager i UserManager nie są obsługiwane w Razor składnikach, użyj internetowych punktów końcowych interfejsu API w Blazor aplikacji do przetwarzania akcji konta użytkownika.

Używanie niestandardowego układu ze stylami Blazor aplikacji

Układ Identity i style stron można modyfikować w celu tworzenia stron, które używają stylów podobnych do motywu domyślnego Blazor . Takie podejście nie jest objęte dokumentacją.

Tworzenie szkieletu Identity w aplikacji po stronie Blazor serwera z autoryzacją

Identity Uruchom szkielet:

  • W Eksplorator rozwiązań kliknij prawym przyciskiem myszy projekt >Dodaj>nowy element szkieletowy.
  • W okienku po lewej stronie okna dialogowego Dodawanie nowego elementu szkieletowego wybierz pozycję Identity. Wybierz Identity w środkowym okienku. Kliknij przycisk Dodaj.
  • W oknie dialogowym Dodawanie Identity wybierz żądane opcje.
    • Jeśli masz istniejącą, dostosowaną stronę układu (Identity_Layout.cshtml), wybierz istniejącą stronę układu, aby uniknąć zastępowania układu nieprawidłowym znacznikiem przez szkielet. Na przykład wybierz jedną z następujących opcji:
      • Pages/Shared/_Layout.cshtml w przypadku Razor stron lub Blazor Server projektów z istniejącą Razor infrastrukturą stron.
      • Views/Shared/_Layout.cshtml dla projektów MVC lub Blazor Server projektów z istniejącą infrastrukturą MVC.
    • Dla kontekstu danych (dbContext, klasa):
      • Wybierz klasę kontekstu danych. Aby dodać kontekst danych, musisz wybrać co najmniej jeden plik.
      • Aby utworzyć kontekst danych i ewentualnie utworzyć nową klasę użytkownika dla Identityelementu , wybierz + przycisk . Zaakceptuj wartość domyślną lub określ klasę (na przykład Contoso.Data.ApplicationDbContext dla firmy o nazwie "Contoso"). Aby utworzyć nową klasę użytkownika, wybierz + przycisk Klasa użytkownika i określ klasę (na przykład ContosoUser dla firmy o nazwie "Contoso").
    • Wybierz przycisk Dodaj, aby uruchomić szkielet.

Niektóre Identity opcje są konfigurowane w programie Areas/Identity/IdentityHostingStartup.cs. Aby uzyskać więcej informacji, zobacz IHostingStartup.

Aplikacje po stronie Blazor klienta

Aplikacje po stronie Blazor klienta używają własnych Identity metod interfejsu użytkownika i nie mogą używać szkieletu ASP.NET Core Identity . Aplikacje Blazor hostowane po stronie serwera ASP.NET Core mogą postępować zgodnie Razor ze wskazówkami dotyczącymi stron/MVC w tym artykule i są skonfigurowane tak samo jak każda inna aplikacja ASP.NET Core, która obsługuje Identityusługę .

Struktura Blazor nie zawiera Razor wersji składników stron interfejsu Identity użytkownika. Identity Składniki interfejsu użytkownika Razor mogą być niestandardowe lub uzyskiwane z nieobsługiwanych źródeł innych firm.

Aby uzyskać więcej informacji, zobacz Blazor Zabezpieczenia i Identity artykuły.

Tworzenie pełnego Identity źródła interfejsu użytkownika

Aby zachować pełną kontrolę nad interfejsem Identity użytkownika, uruchom Identity szkielet i wybierz pozycję Przesłoń wszystkie pliki.

Poniższy wyróżniony kod przedstawia zmiany w celu zastąpienia domyślnego Identity interfejsu użytkownika Identity w aplikacji internetowej platformy ASP.NET Core 2.1. Możesz to zrobić, aby mieć pełną kontrolę nad interfejsem Identity użytkownika.

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>();
}

Wartość domyślna Identity jest zastępowana w następującym kodzie:

services.AddIdentity<IdentityUser, IdentityRole>()
    // services.AddDefaultIdentity<IdentityUser>()
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders();

Poniższy kod ustawia wartości LoginPath, LogoutPathi AccessDeniedPath:

services.ConfigureApplicationCookie(options =>
{
    options.LoginPath = $"/Identity/Account/Login";
    options.LogoutPath = $"/Identity/Account/Logout";
    options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
});

Zarejestruj implementację IEmailSender , na przykład:

// 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;
    }
}

Konfiguracja hasła

Jeśli PasswordOptions konfiguracja atrybutu jest skonfigurowana w Startup.ConfigureServicesprogramie , [StringLength] może być wymagana Password dla właściwości na stronach szkieletowych.Identity InputModelPassword właściwości znajdują się w następujących plikach:

  • Areas/Identity/Pages/Account/Register.cshtml.cs
  • Areas/Identity/Pages/Account/ResetPassword.cshtml.cs

Wyłączanie strony

W tej sekcji pokazano, jak wyłączyć stronę rejestrowania, ale podejście może służyć do wyłączania dowolnej strony.

Aby wyłączyć rejestrację użytkownika:

  • IdentitySzkielet . Uwzględnij ciąg Account.Register, Account.Login i Account.RegisterConfirmation. Na przykład:

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  • Zaktualizuj, Areas/Identity/Pages/Account/Register.cshtml.cs aby użytkownicy nie mogli zarejestrować się z tego punktu końcowego:

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • Aktualizuj Areas/Identity/Pages/Account/Register.cshtml , aby zachować spójność z poprzednimi zmianami:

    @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>
    
  • Oznacz jako komentarz lub usuń link rejestracji z Areas/Identity/Pages/Account/Login.cshtml

    @*
    <p>
        <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
    </p>
    *@
    
  • Zaktualizuj stronę Obszary/Identity/Strony/Konto/RegisterConfirmation.

    • Usuń kod i linki z pliku cshtml.
    • Usuń kod potwierdzenia z pliku PageModel:
    [AllowAnonymous]
      public class RegisterConfirmationModel : PageModel
      {
          public IActionResult OnGet()
          {  
              return Page();
          }
      }
    

Dodawanie użytkowników za pomocą innej aplikacji

Podaj mechanizm dodawania użytkowników spoza aplikacji internetowej. Opcje dodawania użytkowników obejmują:

  • Dedykowana aplikacja internetowa dla administratorów.
  • Aplikacja konsolowa.

Poniższy kod przedstawia jedno podejście do dodawania użytkowników:

  • Lista użytkowników jest odczytywana do pamięci.
  • Dla każdego użytkownika jest generowane silne unikatowe hasło.
  • Użytkownik zostanie dodany do Identity bazy danych.
  • Użytkownik jest powiadamiany i powiadamiany o zmianie hasła.
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>();
            });
}

Poniższy kod przedstawia dodawanie użytkownika:


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;
}

Podobne podejście można zastosować w scenariuszach produkcyjnych.

Zapobieganie publikowaniu zasobów statycznych Identity

Aby zapobiec publikowaniu zasobów statycznych Identity w katalogu głównym sieci Web, zobacz Wprowadzenie do Identity ASP.NET Core.

Dodatkowe zasoby