Identity Gerüst in ASP.NET Core Projekten

Von Rick Anderson

ASP.NET Core stellt ASP.NET Core Identity als Razor Klassenbibliothek bereit. Anwendungen, die das Gerüst enthalten Identity , können angewendet werden, um den Quellcode in der IdentityRazor Klassenbibliothek (RCL) selektiv hinzuzufügen. Sie sollten Quellcode generieren, um den Code und das Verhalten ändern zu können. Sie können das Gerüst beispielsweise anweisen, den bei der Registrierung verwendeten Code zu generieren. Generierter Code hat Vorrang vor dem gleichen Code in der Razor-Klassenbibliothek Identity. Informationen zum Vollständigen Steuern der Benutzeroberfläche und nicht zur Verwendung der Standard-RCL finden Sie im Abschnitt "Vollständige Identity UI-Quelle erstellen".

Anwendungen, die keine Authentifizierung enthalten, können das Gerüst anwenden, um das RCL-Paket Identity hinzuzufügen. Sie können Code der Klassenbibliothek Identity auswählen, der generiert werden soll.

Obwohl das Gerüst den größten Teil des erforderlichen Codes generiert, müssen Sie Ihr Projekt aktualisieren, um den Prozess abzuschließen. In diesem Dokument werden die Schritte erläutert, die zum Abschließen eines Identity Gerüstupdates erforderlich sind.

Es wird empfohlen, ein Quellcodeverwaltungssystem zu verwenden, das Dateiunterschiede anzeigt und Es Ihnen ermöglicht, änderungen zurückzugeben. Überprüfen Sie die Änderungen nach dem Ausführen des Identity Gerüsts.

Dienste sind erforderlich, wenn zweistufige Authentifizierung, Kontobestätigung und Kennwortwiederherstellung und andere Sicherheitsfeatures mit Identityverwendet werden. Dienste oder Dienst-Stubs werden beim Gerüst Identitynicht generiert. Dienste, um diese Features zu aktivieren, müssen manuell hinzugefügt werden. Siehe z. B. "Email Bestätigung anfordern".

In der Regel sollten Apps, die mit einzelnen Konten erstellt wurden, keinen neuen Datenkontext erstellen.

Identity Gerüst in ein Razor Projekt ohne vorhandene Autorisierung

Installieren Sie das Microsoft.VisualStudio.Web.CodeGeneration.Design NuGet-Paket:

In der Visual Studio-Paket-Manager-Konsole:

Install-Package Microsoft.VisualStudio.Web.CodeGeneration.Design

Führen Sie das Identity Gerüst aus:

  • Klicken Sie aus Projektmappen-Explorer mit der rechten Maustaste auf das Projekt >"Neues Gerüstelementhinzufügen>".
  • Wählen Sie im linken Bereich des Dialogfelds "Neues Gerüstelement hinzufügen" die Option "Hinzufügen" ausIdentity>.
  • Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus.
    • Wählen Sie Ihre vorhandene Layoutseite aus, oder Ihre Layoutdatei wird mit falschem Markup überschrieben:
      • ~/Pages/Shared/_Layout.cshtml für Razor Seiten
      • ~/Views/Shared/_Layout.cshtml für MVC-Projekte
      • Blazor Server Apps, die aus der Blazor Server Vorlage (blazorserver) erstellt wurden, sind standardmäßig nicht für Razor Seiten oder MVC konfiguriert. Lassen Sie den Layoutseiteneintrag leer.
    • Wählen Sie die + Schaltfläche aus, um eine neue Datenkontextklasse zu erstellen. Akzeptieren Sie den Standardwert, oder geben Sie eine Klasse an (z. B MyApplication.Data.ApplicationDbContext. ).
  • Wählen Sie Hinzufügen.

Migrationen, UseAuthentication und Layout

Der generierte Identity Datenbankcode erfordert Entity Framework Core-Migrationen. Erstellen Sie eine Migration, und aktualisieren Sie die Datenbank. Führen Sie beispielsweise die folgenden Befehle aus:

In der Visual Studio-Paket-Manager-Konsole:

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

Der Nameparameter "CreateIdentitySchema" für den Add-Migration Befehl ist beliebig. "CreateIdentitySchema" beschreibt die Migration.

Layoutänderungen

Optional: Hinzufügen der Anmeldeteil_LoginPartial () zur Layoutdatei:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - WebRPnoAuth2Auth</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
    <link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
    <link rel="stylesheet" href="~/WebRPnoAuth2Auth.styles.css" asp-append-version="true" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">WebRPnoAuth2Auth</a>
                <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                        </li>
                    </ul>
                    <partial name="_LoginPartial" />
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2021 - WebRPnoAuth2Auth - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

    <script src="~/lib/jquery/dist/jquery.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

    @await RenderSectionAsync("Scripts", required: false)
</body>
</html>

Identity Gerüst in ein Razor Projekt mit Autorisierung

Installieren Sie das Microsoft.VisualStudio.Web.CodeGeneration.Design NuGet-Paket:

In der Visual Studio-Paket-Manager-Konsole:

Install-Package Microsoft.VisualStudio.Web.CodeGeneration.Design

Führen Sie das Identity Gerüst aus:

  • Klicken Sie aus Projektmappen-Explorer mit der rechten Maustaste auf das Projekt >"Neues Gerüstelementhinzufügen>".
  • Wählen Sie im linken Bereich des Dialogfelds " Neues Gerüstelement hinzufügen " die Option aus Identity. Wählen Sie Identity im mittleren Bereich aus. Wählen Sie die Schaltfläche Hinzufügen aus.
  • Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus.
    • Wählen Sie Ihre vorhandene Layoutseite aus, sodass die Layoutdatei nicht mit falschem Markup überschrieben wird. Wenn eine vorhandene _Layout.cshtml Datei ausgewählt ist, wird sie nicht überschrieben. Zum Beispiel:
      • ~/Pages/Shared/_Layout.cshtml für Razor Seiten oder Blazor Server Projekte mit vorhandener Razor Pages-Infrastruktur.
      • ~/Views/Shared/_Layout.cshtml für MVC-Projekte oder Blazor Server -Projekte mit vorhandener MVC-Infrastruktur.
  • Wenn Sie Ihren vorhandenen Datenkontext verwenden möchten, wählen Sie mindestens eine Datei aus, um sie außer Kraft zu setzen. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
    • Wählen Sie Ihre Datenkontextklasse aus.
    • Wählen Sie Hinzufügen.
  • So erstellen Sie einen neuen Benutzerkontext und erstellen möglicherweise eine benutzerdefinierte Benutzerklasse für Identity:
    • Wählen Sie die + Schaltfläche aus, um eine neue Datenkontextklasse zu erstellen. Akzeptieren Sie den Standardwert, oder geben Sie eine Klasse an (z. B MyApplication.Data.ApplicationDbContext. ).
    • Wählen Sie Hinzufügen.

Hinweis: Wenn Sie einen neuen Benutzerkontext erstellen, müssen Sie keine Datei auswählen, die überschreiben soll.

Führen Sie das Identity Gerüst aus:

  • Klicken Sie aus Projektmappen-Explorer mit der rechten Maustaste auf das Projekt >">Neues Gerüst hinzufügen".
  • Wählen Sie im linken Bereich des Dialogfelds "Gerüst hinzufügen" die Option "Hinzufügen" ausIdentity>.
  • Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus.
    • Wählen Sie ihre vorhandene Layoutseite aus, sodass Ihre Layoutdatei nicht mit falschem Markup überschrieben wird. Wenn eine vorhandene _Layout.cshtml-Datei ausgewählt ist, wird sie nicht überschrieben. Zum Beispiel:
      • ~/Pages/Shared/_Layout.cshtml für Razor Seiten oder Blazor Server Projekte mit vorhandener Razor Seiteninfrastruktur
      • ~/Views/Shared/_Layout.cshtml für MVC-Projekte oder Blazor Server Projekte mit vorhandener MVC-Infrastruktur
  • Wenn Sie Ihren vorhandenen Datenkontext verwenden möchten, wählen Sie mindestens eine Datei aus, um sie außer Kraft zu setzen. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
    • Wählen Sie Ihre Datenkontextklasse aus.
    • Wählen Sie Hinzufügen.
  • So erstellen Sie einen neuen Benutzerkontext und erstellen Möglicherweise eine benutzerdefinierte Benutzerklasse für Identity:
    • Wählen Sie die + Schaltfläche aus, um eine neue Datenkontextklasse zu erstellen. Akzeptieren Sie den Standardwert oder geben Sie eine Klasse an (z MyApplication.Data.ApplicationDbContext. B. ).
    • Wählen Sie Hinzufügen.

Hinweis: Wenn Sie einen neuen Benutzerkontext erstellen, müssen Sie keine Datei auswählen, die überschrieben werden soll.

Identity Gerüst in ein MVC-Projekt ohne vorhandene Autorisierung

Installieren Sie das Microsoft.VisualStudio.Web.CodeGeneration.Design NuGet-Paket:

In der Visual Studio-Paket-Manager-Konsole:

Install-Package Microsoft.VisualStudio.Web.CodeGeneration.Design

Führen Sie das Identity Gerüst aus:

  • Klicken Sie aus Projektmappen-Explorer mit der rechten Maustaste auf das Projekt >">Neues Gerüst hinzufügen".
  • Wählen Sie im linken Bereich des Dialogfelds "Neues Gerüst hinzufügen" die Option "Hinzufügen" ausIdentity>.
  • Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus.
    • Wählen Sie Ihre vorhandene Layoutseite aus, oder Die Layoutdatei wird mit falschem Markup überschrieben:
      • ~/Pages/Shared/_Layout.cshtml für Razor Seiten
      • ~/Views/Shared/_Layout.cshtml für MVC-Projekte
      • Blazor Server Apps, die aus der Blazor Server Vorlage erstellt wurden (blazorserver) sind standardmäßig nicht für Razor Seiten oder MVC konfiguriert. Lassen Sie den Layoutseiteneintrag leer.
    • Wählen Sie die + Schaltfläche aus, um eine neue Datenkontextklasse zu erstellen. Akzeptieren Sie den Standardwert oder geben Sie eine Klasse an (z MyApplication.Data.ApplicationDbContext. B. ).
  • Wählen Sie Hinzufügen.

Optional: Hinzufügen des Anmeldeteils (_LoginPartial) zur Views/Shared/_Layout.cshtml Datei:

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

Der generierte Identity Datenbankcode erfordert Entität Framework Core Migrationen. Erstellen Sie eine Migration und aktualisieren Sie die Datenbank. Führen Sie beispielsweise die folgenden Befehle aus:

In der Visual Studio-Paket-Manager-Konsole:

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

Der Parameter "Schema erstellenIdentity" für den Add-Migration Befehl ist beliebig. "CreateIdentitySchema" beschreibt die Migration.

Program.cs Fügen Sie MapRazorPages dem folgenden hervorgehobenen Code hinzu:

using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebMVCauth.Data;

var builder = WebApplication.CreateBuilder(args);

var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();

builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddControllersWithViews();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseMigrationsEndPoint();
}
else
{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapRazorPages();

app.Run();

Identity Gerüst in ein MVC-Projekt mit Autorisierung

Installieren Sie das Microsoft.VisualStudio.Web.CodeGeneration.Design NuGet-Paket:

In der Visual Studio-Paket-Manager-Konsole:

Install-Package Microsoft.VisualStudio.Web.CodeGeneration.Design

Führen Sie das Identity Gerüst aus:

  • Klicken Sie aus Projektmappen-Explorer mit der rechten Maustaste auf das Projekt >">Neues Gerüst hinzufügen".
  • Wählen Sie im linken Bereich des Dialogfelds "Neues Gerüst hinzufügen " die Option aus Identity. Wählen Sie im mittleren Bereich aus Identity . Wählen Sie die Schaltfläche Hinzufügen aus.
  • Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus.
    • Wählen Sie ihre vorhandene Layoutseite aus, sodass Ihre Layoutdatei nicht mit falschem Markup überschrieben wird. Wenn eine vorhandene _Layout.cshtml Datei ausgewählt ist, wird sie nicht überschrieben. Zum Beispiel:
      • ~/Pages/Shared/_Layout.cshtml für Razor Seiten oder Blazor Server Projekte mit vorhandener Razor Seiteninfrastruktur.
      • ~/Views/Shared/_Layout.cshtml für MVC-Projekte oder Blazor Server Projekte mit vorhandener MVC-Infrastruktur.
  • Wenn Sie Ihren vorhandenen Datenkontext verwenden möchten, wählen Sie mindestens eine Datei aus, um sie außer Kraft zu setzen. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
    • Wählen Sie Ihre Datenkontextklasse aus.
    • Wählen Sie Hinzufügen.
  • So erstellen Sie einen neuen Benutzerkontext und erstellen Möglicherweise eine benutzerdefinierte Benutzerklasse für Identity:
    • Wählen Sie die + Schaltfläche aus, um eine neue Datenkontextklasse zu erstellen. Akzeptieren Sie den Standardwert oder geben Sie eine Klasse an (z MyApplication.Data.ApplicationDbContext. B. ).
    • Wählen Sie Hinzufügen.

Hinweis: Wenn Sie einen neuen Benutzerkontext erstellen, müssen Sie keine Datei auswählen, die überschrieben werden soll.

Führen Sie das Identity Gerüst aus:

  • Klicken Sie aus Projektmappen-Explorer mit der rechten Maustaste auf das Projekt >">Neues Gerüst hinzufügen".
  • Wählen Sie im linken Bereich des Dialogfelds "Gerüst hinzufügen" die Option "Hinzufügen" ausIdentity>.
  • Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus.
    • Wählen Sie ihre vorhandene Layoutseite aus, sodass Ihre Layoutdatei nicht mit falschem Markup überschrieben wird. Wenn eine vorhandene _Layout.cshtml-Datei ausgewählt ist, wird sie nicht überschrieben. Zum Beispiel:
      • ~/Pages/Shared/_Layout.cshtml für Razor Seiten oder Blazor Server Projekte mit vorhandener Razor Seiteninfrastruktur
      • ~/Views/Shared/_Layout.cshtml für MVC-Projekte oder Blazor Server Projekte mit vorhandener MVC-Infrastruktur
  • Wenn Sie Ihren vorhandenen Datenkontext verwenden möchten, wählen Sie mindestens eine Datei aus, um sie außer Kraft zu setzen. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
    • Wählen Sie Ihre Datenkontextklasse aus.
    • Wählen Sie Hinzufügen.
  • So erstellen Sie einen neuen Benutzerkontext und erstellen Möglicherweise eine benutzerdefinierte Benutzerklasse für Identity:
    • Wählen Sie die + Schaltfläche aus, um eine neue Datenkontextklasse zu erstellen. Akzeptieren Sie den Standardwert oder geben Sie eine Klasse an (z MyApplication.Data.ApplicationDbContext. B. ).
    • Wählen Sie Hinzufügen.

Hinweis: Wenn Sie einen neuen Benutzerkontext erstellen, müssen Sie keine Datei auswählen, die überschrieben werden soll.

Identity Gerüst in ein Blazor Server Projekt

Installieren Sie das Microsoft.VisualStudio.Web.CodeGeneration.Design NuGet-Paket:

In der Visual Studio-Paket-Manager-Konsole:

Install-Package Microsoft.VisualStudio.Web.CodeGeneration.Design

Führen Sie das Identity Gerüst aus:

  • Klicken Sie aus Projektmappen-Explorer mit der rechten Maustaste auf das Projekt >">Neues Gerüst hinzufügen".
  • Wählen Sie im linken Bereich des Dialogfelds "Neues Gerüst hinzufügen " die Option aus Identity. Wählen Sie im mittleren Bereich aus Identity . Wählen Sie die Schaltfläche Hinzufügen aus.
  • Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus.
    • Wählen Sie ihre vorhandene Layoutseite aus, sodass Ihre Layoutdatei nicht mit falschem Markup überschrieben wird. Wenn eine vorhandene _Layout.cshtml Datei ausgewählt ist, wird sie nicht überschrieben. Zum Beispiel:
      • ~/Pages/Shared/_Layout.cshtml für Razor Seiten oder Blazor Server Projekte mit vorhandener Razor Seiteninfrastruktur.
      • ~/Views/Shared/_Layout.cshtml für MVC-Projekte oder Blazor Server Projekte mit vorhandener MVC-Infrastruktur.
  • Wenn Sie Ihren vorhandenen Datenkontext verwenden möchten, wählen Sie mindestens eine Datei aus, um sie außer Kraft zu setzen. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
    • Wählen Sie Ihre Datenkontextklasse aus.
    • Wählen Sie Hinzufügen.
  • So erstellen Sie einen neuen Benutzerkontext und erstellen Möglicherweise eine benutzerdefinierte Benutzerklasse für Identity:
    • Wählen Sie die + Schaltfläche aus, um eine neue Datenkontextklasse zu erstellen. Akzeptieren Sie den Standardwert oder geben Sie eine Klasse an (z MyApplication.Data.ApplicationDbContext. B. ).
    • Wählen Sie Hinzufügen.

Hinweis: Wenn Sie einen neuen Benutzerkontext erstellen, müssen Sie keine Datei auswählen, die überschrieben werden soll.

Führen Sie das Identity Gerüst aus:

  • Klicken Sie aus Projektmappen-Explorer mit der rechten Maustaste auf das Projekt >">Neues Gerüst hinzufügen".
  • Wählen Sie im linken Bereich des Dialogfelds "Gerüst hinzufügen" die Option "Hinzufügen" ausIdentity>.
  • Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus.
    • Wählen Sie ihre vorhandene Layoutseite aus, sodass Ihre Layoutdatei nicht mit falschem Markup überschrieben wird. Wenn eine vorhandene _Layout.cshtml-Datei ausgewählt ist, wird sie nicht überschrieben. Zum Beispiel:
      • ~/Pages/Shared/_Layout.cshtml für Razor Seiten oder Blazor Server Projekte mit vorhandener Razor Seiteninfrastruktur
      • ~/Views/Shared/_Layout.cshtml für MVC-Projekte oder Blazor Server Projekte mit vorhandener MVC-Infrastruktur
  • Wenn Sie Ihren vorhandenen Datenkontext verwenden möchten, wählen Sie mindestens eine Datei aus, um sie außer Kraft zu setzen. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
    • Wählen Sie Ihre Datenkontextklasse aus.
    • Wählen Sie Hinzufügen.
  • So erstellen Sie einen neuen Benutzerkontext und erstellen Möglicherweise eine benutzerdefinierte Benutzerklasse für Identity:
    • Wählen Sie die + Schaltfläche aus, um eine neue Datenkontextklasse zu erstellen. Akzeptieren Sie den Standardwert oder geben Sie eine Klasse an (z MyApplication.Data.ApplicationDbContext. B. ).
    • Wählen Sie Hinzufügen.

Hinweis: Wenn Sie einen neuen Benutzerkontext erstellen, müssen Sie keine Datei auswählen, die überschrieben werden soll.

Migrationen

Der generierte Identity Datenbankcode erfordert Entität Framework Core Migrationen. Erstellen Sie eine Migration und aktualisieren Sie die Datenbank. Führen Sie beispielsweise die folgenden Befehle aus:

In der Visual Studio-Paket-Manager-Konsole:

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

Der Parameter "Schema erstellenIdentity" für den Add-Migration Befehl ist beliebig. "CreateIdentitySchema" beschreibt die Migration.

Übergeben eines XSRF-Token an die App

Token können an Komponenten übergeben werden:

  • Wenn Authentifizierungstoken bereitgestellt und an die Authentifizierung cookiegespeichert werden, können sie an Komponenten übergeben werden.
  • RazorKomponenten können nicht direkt verwendet HttpContext werden, sodass es keine Möglichkeit gibt, ein Antianforderungs-Forgery-Token (XSRF) auf POST zu Identity"S logout endpoint" zu erhalten./Identity/Account/Logout Ein XSRF-Token kann an Komponenten übergeben werden.

Weitere Informationen finden Sie unter Zusätzliche Sicherheitsszenarien für Blazor Server in ASP.NET Core.

Richten Sie in der Pages/_Host.cshtml Datei das Token nach dem Hinzufügen zu den InitialApplicationState und TokenProvider Klassen ein:

@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf

...

var tokens = new InitialApplicationState
{
    ...

    XsrfToken = Xsrf.GetAndStoreTokens(HttpContext).RequestToken
};

Aktualisieren der Komponente (App.razor) zum Zuweisen der InitialState.XsrfTokenApp :

@inject TokenProvider TokenProvider

...

TokenProvider.XsrfToken = InitialState.XsrfToken;

Der TokenProvider im Thema gezeigte Dienst wird in der LoginDisplay Komponente im folgenden Abschnitt "Layout- und Authentifizierungsablaufänderungen " verwendet.

Registrieren des Tokenanbieterdiensts

Wenn Sie einen Tokenanbieterdienst verwenden, registrieren Sie den Dienst in Program.cs:

builder.Services.AddScoped<TokenProvider>();

Layout- und Authentifizierungsflussänderungen

Hinzufügen einer RedirectToLogin Komponente (RedirectToLogin.razor) zum Ordner der App Shared im Projektstamm:

@inject NavigationManager Navigation
@code {
    protected override void OnInitialized()
    {
        Navigation.NavigateTo("Identity/Account/Login?returnUrl=" +
            Uri.EscapeDataString(Navigation.Uri), true);
    }
}

Fügen Sie eine LoginDisplay Komponente (LoginDisplay.razor) zum Ordner der App Shared hinzu. Ein Tokenanbieterdienst im TokenProvider folgenden Beispiel stellt das XSRF-Token für das HTML-Formular bereit, das POSTs zum IdentityLogout-Endpunkt enthält:

@using Microsoft.AspNetCore.Components.Authorization
@inject NavigationManager Navigation
@inject TokenProvider TokenProvider

<AuthorizeView>
    <Authorized>
        <a href="Identity/Account/Manage/Index">
            Hello, @context.User.Identity.Name!
        </a>
        <form action="/Identity/Account/Logout?returnUrl=%2F" method="post">
            <button class="nav-link btn btn-link" type="submit">Logout</button>
            <input name="__RequestVerificationToken" type="hidden" 
                value="@TokenProvider.XsrfToken">
        </form>
    </Authorized>
    <NotAuthorized>
        <a href="Identity/Account/Register">Register</a>
        <a href="Identity/Account/Login">Login</a>
    </NotAuthorized>
</AuthorizeView>

Fügen Sie in der Komponente (Shared/MainLayout.razor) die LoginDisplay Komponente zum Inhalt des MainLayout oberen Zeilenelements <div> hinzu:

<div class="top-row px-4 auth">
    <LoginDisplay />
    <a href="https://learn.microsoft.com/aspnet/" target="_blank">About</a>
</div>

Stilauthentifizierungsendpunkte

Da Blazor Server Seiten Identity verwendet Razor werden, ändert sich das Formatieren der Benutzeroberfläche, wenn ein Besucher zwischen Identity Seiten und Komponenten navigiert. Sie verfügen über zwei Optionen, um die unkongbaren Formatvorlagen zu beheben:

Benutzerdefinierte Identity Komponenten

Identity ASP.NET Core soll im Kontext der HTTP-Anforderungs- und Antwortkommunikation funktionieren, was nicht das primäre Clientserverkommunikationsmodell in Blazor Apps ist. ASP.NET Core-Apps, welche die Benutzerverwaltung mit ASP.NET Core Identity umsetzen, sollten für eine Identity Benutzeroberfläche Razor Seiten anstelle von Razor Komponenten verwenden, z. B. Benutzerregistrierung, Anmelden, Abmelden und andere Benutzerverwaltungsaufgaben.

Ein Ansatz zum Verwenden von Komponenten für Identity anstelle von Seiten besteht darin, benutzerdefinierte Identity Komponenten zu erstellen. Da SignInManager<TUser> sie in Razor Komponenten nicht unterstützt werden, verwenden Sie API-Endpunkte, um Aktionen zu verwaltenIdentity.UserManager<TUser> Anleitungen zum Erstellen von Web-APIs für Blazor Apps finden Sie unter Aufrufen einer Web-API aus einer ASP.NET Core-AppBlazor.

Weitere Kontexte und weitere Unterstützung finden Sie in den folgenden Diskussionen und Ressourcen:

Verwenden eines benutzerdefinierten Layouts mit Blazor App-Formatvorlagen

Das Seitenlayout und die Identity Formatvorlagen können geändert werden, um Seiten zu erstellen, die das Standarddesign Blazor verwenden.

Hinweis

Das Beispiel in diesem Abschnitt ist nur ein Ausgangspunkt für die Anpassung. Zusätzliche Arbeit ist wahrscheinlich für die beste Benutzererfahrung erforderlich.

Erstellen Sie eine neue NavMenu_IdentityLayout Komponente (Shared/NavMenu_IdentityLayout.razor). Verwenden Sie für das Markup und den Code der Komponente denselben Inhalt der Komponente der App NavMenu (Shared/NavMenu.razor). Entfernen Sie alle NavLinkKomponenten, die nicht anonym erreicht werden können, da automatische Umleitungen in der RedirectToLogin Komponente für Komponenten fehlschlagen, die Authentifizierung oder Autorisierung erfordern.

Führen Sie in der Pages/Shared/Layout.cshtml Datei die folgenden Änderungen aus:

  • Fügen Sie Razor dem Oberen der Datei Direktiven hinzu, um Tag-Hilfshilfen und die Komponenten der App im Shared Ordner zu verwenden:

    @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
    @using {APPLICATION ASSEMBLY}.Shared
    

    Ersetzen Sie {APPLICATION ASSEMBLY} den Assemblynamen der App durch den Namen der App.

  • Fügen Sie dem <head> Inhalt ein Tag und Blazor stylesheet <base><link> hinzu:

    <base href="~/" />
    <link rel="stylesheet" href="~/css/site.css" />
    
  • Ändern Sie den Inhalt des <body> Tags in folgendes:

    <div class="sidebar" style="float:left">
        <component type="typeof(NavMenu_IdentityLayout)" 
            render-mode="ServerPrerendered" />
    </div>
    
    <div class="main" style="padding-left:250px">
        <div class="top-row px-4">
            @{
                var result = Engine.FindView(ViewContext, "_LoginPartial", 
                    isMainPage: false);
            }
            @if (result.Success)
            {
                await Html.RenderPartialAsync("_LoginPartial");
            }
            else
            {
                throw new InvalidOperationException("The default Identity UI " +
                    "layout requires a partial view '_LoginPartial'.");
            }
            <a href="https://learn.microsoft.com/aspnet/" target="_blank">About</a>
        </div>
    
        <div class="content px-4">
            @RenderBody()
        </div>
    </div>
    
    <script src="~/Identity/lib/jquery/dist/jquery.js"></script>
    <script src="~/Identity/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
    <script src="~/Identity/js/site.js" asp-append-version="true"></script>
    @RenderSection("Scripts", required: false)
    <script src="_framework/blazor.server.js"></script>
    

Eigenständige oder gehostete Blazor WebAssembly Apps

Clientseitige Blazor WebAssembly Apps verwenden eigene Identity UI-Ansätze und können ASP.NET Core Identity Gerüste nicht verwenden. Serverseitige ASP.NET Core Apps von gehosteten Blazor Lösungen können den Anleitungen "Pages/MVC" in diesem Artikel folgen und wie jede andere Art von ASP.NET Core-App konfiguriert werden, die Razor unterstützt Identitywird.

Das Blazor Framework enthält Razor keine Komponentenversionen von Identity UI-Seiten. Identity Ui-Komponenten Razor können benutzerdefinierte erstellt oder von nicht unterstützten Drittanbieterquellen abgerufen werden.

Weitere Informationen finden Sie in den Blazor Artikeln "Sicherheit" und Identity "Artikel".

Erstellen einer vollständigen Identity Ui-Quelle

Um die vollständige Kontrolle der Identity Benutzeroberfläche zu erhalten, führen Sie das Identity Gerüst aus, und wählen Sie alle Dateien außer Kraft.

Kennwortkonfiguration

Wenn PasswordOptions sie in konfiguriert sind, [StringLength] kann die Attributkonfiguration für die Password Eigenschaft in Startup.ConfigureServicesgerüsteten Identity Seiten erforderlich sein. InputModelPassword Eigenschaften finden Sie in den folgenden Dateien:

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

Deaktivieren einer Seite

In diesem Abschnitt wird gezeigt, wie Sie die Registerseite deaktivieren, aber der Ansatz kann verwendet werden, um jede Seite zu deaktivieren.

So deaktivieren Sie die Benutzerregistrierung:

  • IdentityGerüst . Umfassen Sie "Account.Register", "Account.Login" und "Account.RegisterConfirmation". Zum Beispiel:

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  • Aktualisieren Areas/Identity/Pages/Account/Register.cshtml.cs Sie so, dass Benutzer von diesem Endpunkt nicht registrieren können:

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • Aktualisieren Areas/Identity/Pages/Account/Register.cshtml , um mit den vorherigen Änderungen konsistent zu sein:

    @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>
    
  • Kommentieren oder Entfernen des Registrierungslinks aus Areas/Identity/Pages/Account/Login.cshtml

    @*
    <p>
        <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
    </p>
    *@
    
  • Aktualisieren Sie die Seite "Bereiche/Seiten/IdentitySeiten/Konto/RegisterConfirmation ".

    • Entfernen Sie den Code und links aus der cshtml-Datei.
    • Entfernen Sie den Bestätigungscode aus dem PageModel:
    [AllowAnonymous]
      public class RegisterConfirmationModel : PageModel
      {
          public IActionResult OnGet()
          {  
              return Page();
          }
      }
    

Verwenden einer anderen App zum Hinzufügen von Benutzern

Stellen Sie einen Mechanismus bereit, um Benutzer außerhalb der Web-App hinzuzufügen. Optionen zum Hinzufügen von Benutzern umfassen:

  • Eine dedizierte Administratorweb-App.
  • Eine Konsolen-App.

Im folgenden Code wird ein Ansatz zum Hinzufügen von Benutzern beschrieben:

  • Eine Liste der Benutzer wird in den Arbeitsspeicher gelesen.
  • Ein sicheres eindeutiges Kennwort wird für jeden Benutzer generiert.
  • Der Benutzer wird der Identity Datenbank hinzugefügt.
  • Der Benutzer wird benachrichtigt und aufgefordert, das Kennwort zu ändern.
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>();
            });
}

Im folgenden Code wird das Hinzufügen eines Benutzers beschrieben:


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

Eine ähnliche Vorgehensweise kann für Produktionsszenarien gefolgt werden.

Verhindern der Veröffentlichung statischer Identity Ressourcen

Informationen zum Verhindern der Veröffentlichung statischer Identity Ressourcen im Webstamm finden Sie in der Einführung in Identity ASP.NET Core.

ASP.NET Core stellt ASP.NET Core Identity als Razor Klassenbibliothek bereit. Anwendungen, die enthalten sind, können das Gerüst anwenden, um den Quellcode selektiv hinzuzufügen, der in der IdentityRazor Klassenbibliothek (RCL) enthalten Identity ist. Sie sollten Quellcode generieren, um den Code und das Verhalten ändern zu können. Sie können das Gerüst beispielsweise anweisen, den bei der Registrierung verwendeten Code zu generieren. Generierter Code hat Vorrang vor dem gleichen Code in der Razor-Klassenbibliothek Identity. Um vollständige Kontrolle über die Benutzeroberfläche zu erhalten und die Standard-RCL nicht zu verwenden, finden Sie im Abschnitt "Vollständige UI-Quelle erstellenIdentity".

Anwendungen, die keine Authentifizierung enthalten, können das Gerüst anwenden, um das RCL-Paket Identity hinzuzufügen. Sie können Code der Klassenbibliothek Identity auswählen, der generiert werden soll.

Obwohl der Gerüster die meisten erforderlichen Code generiert, müssen Sie Ihr Projekt aktualisieren, um den Prozess abzuschließen. In diesem Dokument werden die Schritte erläutert, die zum Abschließen eines Identity Gerüstupdates erforderlich sind.

Es wird empfohlen, ein Quellcodeverwaltungssystem zu verwenden, das Dateiunterschiede anzeigt und Es Ihnen ermöglicht, Änderungen zurückzugeben. Überprüfen Sie die Änderungen nach dem Ausführen des Identity Gerüsts.

Dienste sind bei Verwendung von Two Factor Authentication, Kontobestätigung und Kennwortwiederherstellung und anderen Sicherheitsfeatures mit Identityerforderlich. Dienste oder Dienst-Stubs werden beim Gerüst Identitynicht generiert. Dienste, um diese Features zu aktivieren, müssen manuell hinzugefügt werden. Weitere Informationen finden Sie z. B. unter "Email Bestätigung erfordern".

Beim Gerüst Identity mit einem neuen Datenkontext in einem Projekt mit vorhandenen einzelnen Konten:

  • Entfernen Sie in Startup.ConfigureServices, die Aufrufe zu:
    • AddDbContext
    • AddDefaultIdentity

So werden Sie z. B AddDbContextAddDefaultIdentity . im folgenden Code kommentiert:

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

Der vorherige Code kommentiert den Code, der in dupliziert wird Areas/Identity/IdentityHostingStartup.cs

In der Regel sollten Apps, die mit einzelnen Konten erstellt wurden, keinen neuen Datenkontext erstellen.

Identity Gerüst in ein leeres Projekt

Führen Sie das Identity Gerüst aus:

  • Klicken Sie aus Projektmappen-Explorer mit der rechten Maustaste auf das Projekt >">Neues Gerüst hinzufügen".
  • Wählen Sie im linken Bereich des Dialogfelds "Neues Gerüst hinzufügen" die Option "Hinzufügen" ausIdentity>.
  • Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus.
    • Wählen Sie Ihre vorhandene Layoutseite aus, oder Die Layoutdatei wird mit falschem Markup überschrieben:
      • ~/Pages/Shared/_Layout.cshtml für Razor Seiten
      • ~/Views/Shared/_Layout.cshtml für MVC-Projekte
      • Blazor Server Apps, die aus der Blazor Server Vorlage erstellt wurden (blazorserver) sind standardmäßig nicht für Razor Seiten oder MVC konfiguriert. Lassen Sie den Layoutseiteneintrag leer.
    • Wählen Sie die + Schaltfläche aus, um eine neue Datenkontextklasse zu erstellen. Akzeptieren Sie den Standardwert oder geben Sie eine Klasse an (z MyApplication.Data.ApplicationDbContext. B. ).
  • Wählen Sie Hinzufügen.

Aktualisieren Sie die Startup Klasse mit Code ähnlich wie folgt:

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 wird empfohlen, aber nicht erforderlich. Weitere Informationen finden Sie im HTTP Strict Transport Security Protocol.

Der generierte Identity Datenbankcode erfordert Entität Framework Core Migrationen. Erstellen Sie eine Migration und aktualisieren Sie die Datenbank. Führen Sie beispielsweise die folgenden Befehle aus:

In der Visual Studio-Paket-Manager-Konsole:

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

Der Parameter "Schema erstellenIdentity" für den Add-Migration Befehl ist beliebig. "CreateIdentitySchema" beschreibt die Migration.

Identity Gerüst in ein Razor Projekt ohne vorhandene Autorisierung

Führen Sie das Identity Gerüst aus:

  • Klicken Sie aus Projektmappen-Explorer mit der rechten Maustaste auf das Projekt >">Neues Gerüst hinzufügen".
  • Wählen Sie im linken Bereich des Dialogfelds "Neues Gerüst hinzufügen" die Option "Hinzufügen" ausIdentity>.
  • Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus.
    • Wählen Sie Ihre vorhandene Layoutseite aus, oder Die Layoutdatei wird mit falschem Markup überschrieben:
      • ~/Pages/Shared/_Layout.cshtml für Razor Seiten
      • ~/Views/Shared/_Layout.cshtml für MVC-Projekte
      • Blazor Server Apps, die aus der Blazor Server Vorlage erstellt wurden (blazorserver) sind standardmäßig nicht für Razor Seiten oder MVC konfiguriert. Lassen Sie den Layoutseiteneintrag leer.
    • Wählen Sie die + Schaltfläche aus, um eine neue Datenkontextklasse zu erstellen. Akzeptieren Sie den Standardwert oder geben Sie eine Klasse an (z MyApplication.Data.ApplicationDbContext. B. ).
  • Wählen Sie Hinzufügen.

Identity wird in Areas/Identity/IdentityHostingStartup.cs konfiguriert. Weitere Informationen finden Sie unter IHostingStartup.

Migrationen, UseAuthentication und Layout

Der generierte Identity Datenbankcode erfordert Entität Framework Core Migrationen. Erstellen Sie eine Migration und aktualisieren Sie die Datenbank. Führen Sie beispielsweise die folgenden Befehle aus:

In der Visual Studio-Paket-Manager-Konsole:

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

Der Parameter "Schema erstellenIdentity" für den Add-Migration Befehl ist beliebig. "CreateIdentitySchema" beschreibt die Migration.

Authentifizierung aktivieren

Aktualisieren Sie die Startup Klasse mit Code ähnlich wie folgt:

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 wird empfohlen, aber nicht erforderlich. Weitere Informationen finden Sie im HTTP Strict Transport Security Protocol.

Layoutänderungen

Optional: Fügen Sie die Anmeldeteildatei (_LoginPartial) zur Layoutdatei hinzu:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - WebRP</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
    <link rel="stylesheet" href="~/css/site.css" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">WebRP</a>
                <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
                    <partial name="_LoginPartial" />
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                        </li>
                    </ul>
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2019 - WebRP - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

    <script src="~/lib/jquery/dist/jquery.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

    @RenderSection("Scripts", required: false)
</body>
</html>

Identity Gerüst in ein Razor Projekt mit Autorisierung

Führen Sie das Identity Gerüst aus:

  • Klicken Sie aus Projektmappen-Explorer mit der rechten Maustaste auf das Projekt >">Neues Gerüst hinzufügen".
  • Wählen Sie im linken Bereich des Dialogfelds "Neues Gerüst hinzufügen " die Option aus Identity. Wählen Sie im mittleren Bereich aus Identity . Wählen Sie die Schaltfläche Hinzufügen aus.
  • Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus.
    • Wählen Sie ihre vorhandene Layoutseite aus, sodass Ihre Layoutdatei nicht mit falschem Markup überschrieben wird. Wenn eine vorhandene _Layout.cshtml Datei ausgewählt ist, wird sie nicht überschrieben. Beispiel:
      • ~/Pages/Shared/_Layout.cshtml für Razor Seiten oder Blazor Server Projekte mit vorhandener Razor Seiteninfrastruktur.
      • ~/Views/Shared/_Layout.cshtml für MVC-Projekte oder Blazor Server Projekte mit vorhandener MVC-Infrastruktur.
  • Wenn Sie Ihren vorhandenen Datenkontext verwenden möchten, wählen Sie mindestens eine Datei aus, um sie außer Kraft zu setzen. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
    • Wählen Sie Ihre Datenkontextklasse aus.
    • Wählen Sie Hinzufügen.
  • So erstellen Sie einen neuen Benutzerkontext und erstellen Möglicherweise eine benutzerdefinierte Benutzerklasse für Identity:
    • Wählen Sie die + Schaltfläche aus, um eine neue Datenkontextklasse zu erstellen. Akzeptieren Sie den Standardwert oder geben Sie eine Klasse an (z MyApplication.Data.ApplicationDbContext. B. ).
    • Wählen Sie Hinzufügen.

Hinweis: Wenn Sie einen neuen Benutzerkontext erstellen, müssen Sie keine Datei auswählen, die überschrieben werden soll.

Führen Sie das Identity Gerüst aus:

  • Klicken Sie aus Projektmappen-Explorer mit der rechten Maustaste auf das Projekt >">Neues Gerüst hinzufügen".
  • Wählen Sie im linken Bereich des Dialogfelds "Gerüst hinzufügen" die Option "Hinzufügen" ausIdentity>.
  • Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus.
    • Wählen Sie ihre vorhandene Layoutseite aus, sodass Ihre Layoutdatei nicht mit falschem Markup überschrieben wird. Wenn eine vorhandene _Layout.cshtml-Datei ausgewählt ist, wird sie nicht überschrieben. Beispiel:
      • ~/Pages/Shared/_Layout.cshtml für Razor Seiten oder Blazor Server Projekte mit vorhandener Razor Seiteninfrastruktur
      • ~/Views/Shared/_Layout.cshtml für MVC-Projekte oder Blazor Server Projekte mit vorhandener MVC-Infrastruktur
  • Wenn Sie Ihren vorhandenen Datenkontext verwenden möchten, wählen Sie mindestens eine Datei aus, um sie außer Kraft zu setzen. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
    • Wählen Sie Ihre Datenkontextklasse aus.
    • Wählen Sie Hinzufügen.
  • So erstellen Sie einen neuen Benutzerkontext und erstellen Möglicherweise eine benutzerdefinierte Benutzerklasse für Identity:
    • Wählen Sie die + Schaltfläche aus, um eine neue Datenkontextklasse zu erstellen. Akzeptieren Sie den Standardwert oder geben Sie eine Klasse an (z MyApplication.Data.ApplicationDbContext. B. ).
    • Wählen Sie Hinzufügen.

Hinweis: Wenn Sie einen neuen Benutzerkontext erstellen, müssen Sie keine Datei auswählen, die überschrieben werden soll.

Einige Identity Optionen sind in Areas/Identity/IdentityHostingStartup.cskonfiguriert. Weitere Informationen finden Sie unter IHostingStartup.

Identity Gerüst in ein MVC-Projekt ohne vorhandene Autorisierung

Führen Sie das Identity Gerüst aus:

  • Klicken Sie aus Projektmappen-Explorer mit der rechten Maustaste auf das Projekt >">Neues Gerüst hinzufügen".
  • Wählen Sie im linken Bereich des Dialogfelds "Neues Gerüst hinzufügen" die Option "Hinzufügen" ausIdentity>.
  • Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus.
    • Wählen Sie Ihre vorhandene Layoutseite aus, oder Die Layoutdatei wird mit falschem Markup überschrieben:
      • ~/Pages/Shared/_Layout.cshtml für Razor Seiten
      • ~/Views/Shared/_Layout.cshtml für MVC-Projekte
      • Blazor Server Apps, die aus der Blazor Server Vorlage erstellt wurden (blazorserver) sind standardmäßig nicht für Razor Seiten oder MVC konfiguriert. Lassen Sie den Layoutseiteneintrag leer.
    • Wählen Sie die + Schaltfläche aus, um eine neue Datenkontextklasse zu erstellen. Akzeptieren Sie den Standardwert oder geben Sie eine Klasse an (z MyApplication.Data.ApplicationDbContext. B. ).
  • Wählen Sie Hinzufügen.

Optional: Hinzufügen des Anmeldeteils (_LoginPartial) zur Views/Shared/_Layout.cshtml Datei:

<!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>
  • Verschieben der Pages/Shared/_LoginPartial.cshtml Datei in Views/Shared/_LoginPartial.cshtml

Identity wird in Areas/Identity/IdentityHostingStartup.cs konfiguriert. Weitere Informationen finden Sie unter IHostingStartup.

Der generierte Identity Datenbankcode erfordert Entity Framework Core-Migrationen. Erstellen Sie eine Migration, und aktualisieren Sie die Datenbank. Führen Sie beispielsweise die folgenden Befehle aus:

In der Visual Studio-Paket-Manager-Konsole:

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

Der Nameparameter "CreateIdentitySchema" für den Add-Migration Befehl ist beliebig. "CreateIdentitySchema" beschreibt die Migration.

Aktualisieren Sie die Startup Klasse mit Code wie folgt:

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 wird empfohlen, aber nicht erforderlich. Weitere Informationen finden Sie im HTTP Strict Transport Security Protocol.

Identity Gerüst in ein MVC-Projekt mit Autorisierung

Führen Sie das Identity Gerüst aus:

  • Klicken Sie aus Projektmappen-Explorer mit der rechten Maustaste auf das Projekt >"Neues Gerüstelementhinzufügen>".
  • Wählen Sie im linken Bereich des Dialogfelds " Neues Gerüstelement hinzufügen " die Option aus Identity. Wählen Sie Identity im mittleren Bereich aus. Wählen Sie die Schaltfläche Hinzufügen aus.
  • Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus.
    • Wählen Sie Ihre vorhandene Layoutseite aus, sodass die Layoutdatei nicht mit falschem Markup überschrieben wird. Wenn eine vorhandene _Layout.cshtml Datei ausgewählt ist, wird sie nicht überschrieben. Beispiel:
      • ~/Pages/Shared/_Layout.cshtml für Razor Seiten oder Blazor Server Projekte mit vorhandener Razor Pages-Infrastruktur.
      • ~/Views/Shared/_Layout.cshtml für MVC-Projekte oder Blazor Server -Projekte mit vorhandener MVC-Infrastruktur.
  • Wenn Sie Ihren vorhandenen Datenkontext verwenden möchten, wählen Sie mindestens eine Datei aus, um sie außer Kraft zu setzen. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
    • Wählen Sie Ihre Datenkontextklasse aus.
    • Wählen Sie Hinzufügen.
  • So erstellen Sie einen neuen Benutzerkontext und erstellen möglicherweise eine benutzerdefinierte Benutzerklasse für Identity:
    • Wählen Sie die + Schaltfläche aus, um eine neue Datenkontextklasse zu erstellen. Akzeptieren Sie den Standardwert, oder geben Sie eine Klasse an (z. B MyApplication.Data.ApplicationDbContext. ).
    • Wählen Sie Hinzufügen.

Hinweis: Wenn Sie einen neuen Benutzerkontext erstellen, müssen Sie keine Datei auswählen, die überschreiben soll.

Führen Sie das Identity Gerüst aus:

  • Klicken Sie aus Projektmappen-Explorer mit der rechten Maustaste auf das Projekt >"Neues Gerüstelementhinzufügen>".
  • Wählen Sie im linken Bereich des Dialogfelds "Gerüst hinzufügen" die Option "Hinzufügen" ausIdentity>.
  • Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus.
    • Wählen Sie Ihre vorhandene Layoutseite aus, sodass die Layoutdatei nicht mit falschem Markup überschrieben wird. Wenn eine vorhandene _Layout.cshtml-Datei ausgewählt ist, wird sie nicht überschrieben. Beispiel:
      • ~/Pages/Shared/_Layout.cshtml für Razor Seiten oder Blazor Server Projekte mit vorhandener Razor Pages-Infrastruktur
      • ~/Views/Shared/_Layout.cshtml für MVC-Projekte oder Blazor Server -Projekte mit vorhandener MVC-Infrastruktur
  • Wenn Sie Ihren vorhandenen Datenkontext verwenden möchten, wählen Sie mindestens eine Datei aus, um sie außer Kraft zu setzen. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
    • Wählen Sie Ihre Datenkontextklasse aus.
    • Wählen Sie Hinzufügen.
  • So erstellen Sie einen neuen Benutzerkontext und erstellen möglicherweise eine benutzerdefinierte Benutzerklasse für Identity:
    • Wählen Sie die + Schaltfläche aus, um eine neue Datenkontextklasse zu erstellen. Akzeptieren Sie den Standardwert, oder geben Sie eine Klasse an (z. B MyApplication.Data.ApplicationDbContext. ).
    • Wählen Sie Hinzufügen.

Hinweis: Wenn Sie einen neuen Benutzerkontext erstellen, müssen Sie keine Datei auswählen, die überschreiben soll.

Identity Gerüst in ein Blazor Server Projekt ohne vorhandene Autorisierung

Führen Sie das Identity Gerüst aus:

  • Klicken Sie aus Projektmappen-Explorer mit der rechten Maustaste auf das Projekt >"Neues Gerüstelementhinzufügen>".
  • Wählen Sie im linken Bereich des Dialogfelds "Neues Gerüstelement hinzufügen" die Option "Hinzufügen" ausIdentity>.
  • Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus.
    • Wählen Sie Ihre vorhandene Layoutseite aus, oder Ihre Layoutdatei wird mit falschem Markup überschrieben:
      • ~/Pages/Shared/_Layout.cshtml für Razor Seiten
      • ~/Views/Shared/_Layout.cshtml für MVC-Projekte
      • Blazor Server Apps, die aus der Blazor Server Vorlage (blazorserver) erstellt wurden, sind standardmäßig nicht für Razor Seiten oder MVC konfiguriert. Lassen Sie den Layoutseiteneintrag leer.
    • Wählen Sie die + Schaltfläche aus, um eine neue Datenkontextklasse zu erstellen. Akzeptieren Sie den Standardwert, oder geben Sie eine Klasse an (z. B MyApplication.Data.ApplicationDbContext. ).
  • Wählen Sie Hinzufügen.

Identity wird in Areas/Identity/IdentityHostingStartup.cs konfiguriert. Weitere Informationen finden Sie unter IHostingStartup.

Migrationen

Der generierte Identity Datenbankcode erfordert Entität Framework Core Migrationen. Erstellen Sie eine Migration und aktualisieren Sie die Datenbank. Führen Sie beispielsweise die folgenden Befehle aus:

In der Visual Studio-Paket-Manager-Konsole:

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

Der Parameter "Schema erstellenIdentity" für den Add-Migration Befehl ist beliebig. "CreateIdentitySchema" beschreibt die Migration.

Übergeben eines XSRF-Token an die App

Token können an Komponenten übergeben werden:

  • Wenn Authentifizierungstoken bereitgestellt und an die Authentifizierung cookiegespeichert werden, können sie an Komponenten übergeben werden.
  • RazorKomponenten können nicht direkt verwendet HttpContext werden, sodass es keine Möglichkeit gibt, ein Antianforderungs-Forgery-Token (XSRF) auf POST zu Identity"S logout endpoint" zu erhalten./Identity/Account/Logout Ein XSRF-Token kann an Komponenten übergeben werden.

Weitere Informationen finden Sie unter Zusätzliche Sicherheitsszenarien für Blazor Server in ASP.NET Core.

Richten Sie in der Pages/_Host.cshtml Datei das Token nach dem Hinzufügen zu den InitialApplicationState und TokenProvider Klassen ein:

@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf

...

var tokens = new InitialApplicationState
{
    ...

    XsrfToken = Xsrf.GetAndStoreTokens(HttpContext).RequestToken
};

Aktualisieren der Komponente (App.razor) zum Zuweisen der InitialState.XsrfTokenApp :

@inject TokenProvider TokenProvider

...

TokenProvider.XsrfToken = InitialState.XsrfToken;

Der TokenProvider im Thema gezeigte Dienst wird in der LoginDisplay Komponente im folgenden Abschnitt "Layout- und Authentifizierungsablaufänderungen " verwendet.

Authentifizierung aktivieren

In der Startup-Klasse:

  • Vergewissern Sie sich, dass Razor Seitendienste in Startup.ConfigureServiceshinzugefügt werden.
  • Wenn Sie den TokenProvider verwenden, registrieren Sie den Dienst.
  • Rufen Sie UseDatabaseErrorPage den Anwendungs-Generator in Startup.Configure der Entwicklungsumgebung auf.
  • Rufen UseAuthentication Sie an und UseAuthorization nach UseRouting.
  • Fügen Sie einen Endpunkt für Razor Seiten hinzu.
public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();
    services.AddServerSideBlazor();
    services.AddSingleton<WeatherForecastService>();
    services.AddScoped<TokenProvider>();
}

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();
        endpoints.MapBlazorHub();
        endpoints.MapFallbackToPage("/_Host");
    });
}

UseHsts wird empfohlen, aber nicht erforderlich. Weitere Informationen finden Sie im HTTP Strict Transport Security Protocol.

Layout- und Authentifizierungsflussänderungen

Fügen Sie eine RedirectToLogin Komponente (RedirectToLogin.razor) zum freigegebenen Ordner der App im Projektstamm hinzu:

@inject NavigationManager Navigation
@code {
    protected override void OnInitialized()
    {
        Navigation.NavigateTo("Identity/Account/Login?returnUrl=" +
            Uri.EscapeDataString(Navigation.Uri), true);
    }
}

Fügen Sie eine LoginDisplay Komponente (LoginDisplay.razor) zum freigegebenen Ordner der App hinzu. Der TokenProvider-Dienst stellt das XSRF-Token für das HTML-Formular bereit, das POSTs zum IdentityLogout-Endpunkt bereitstellt:

@using Microsoft.AspNetCore.Components.Authorization
@inject NavigationManager Navigation
@inject TokenProvider TokenProvider

<AuthorizeView>
    <Authorized>
        <a href="Identity/Account/Manage/Index">
            Hello, @context.User.Identity.Name!
        </a>
        <form action="/Identity/Account/Logout?returnUrl=%2F" method="post">
            <button class="nav-link btn btn-link" type="submit">Logout</button>
            <input name="__RequestVerificationToken" type="hidden" 
                value="@TokenProvider.XsrfToken">
        </form>
    </Authorized>
    <NotAuthorized>
        <a href="Identity/Account/Register">Register</a>
        <a href="Identity/Account/Login">Login</a>
    </NotAuthorized>
</AuthorizeView>

Fügen Sie in der Komponente (Shared/MainLayout.razor) die LoginDisplay Komponente zum Inhalt des MainLayout oberen Zeilenelements <div> hinzu:

<div class="top-row px-4 auth">
    <LoginDisplay />
    <a href="https://learn.microsoft.com/aspnet/" target="_blank">About</a>
</div>

Stilauthentifizierungsendpunkte

Da Blazor Server Seiten Identity verwendet Razor werden, ändert sich das Formatieren der Benutzeroberfläche, wenn ein Besucher zwischen Identity Seiten und Komponenten navigiert. Sie verfügen über zwei Optionen, um die unkongbaren Formatvorlagen zu beheben:

Buildkomponenten Identity

Ein Ansatz zum Verwenden von Komponenten für Identity anstelle von Seiten besteht darin, Komponenten zu erstellen Identity . Da SignInManager sie in Razor Komponenten nicht unterstützt werden, verwenden Sie API-Endpunkte in der Blazor Server App, um Benutzerkontenaktionen zu UserManager verarbeiten.

Verwenden eines benutzerdefinierten Layouts mit Blazor App-Formatvorlagen

Das Seitenlayout und die Identity Formatvorlagen können geändert werden, um Seiten zu erstellen, die das Standarddesign Blazor verwenden.

Hinweis

Das Beispiel in diesem Abschnitt ist nur ein Ausgangspunkt für die Anpassung. Zusätzliche Arbeit ist wahrscheinlich für die beste Benutzererfahrung erforderlich.

Erstellen Sie eine neue NavMenu_IdentityLayout Komponente (Shared/NavMenu_IdentityLayout.razor). Verwenden Sie für das Markup und den Code der Komponente denselben Inhalt der Komponente der App NavMenu (Shared/NavMenu.razor). Entfernen Sie alle NavLinkKomponenten, die nicht anonym erreicht werden können, da automatische Umleitungen in der RedirectToLogin Komponente für Komponenten fehlschlagen, die Authentifizierung oder Autorisierung erfordern.

Führen Sie in der Pages/Shared/Layout.cshtml Datei die folgenden Änderungen aus:

  • Fügen Sie Razor dem Oberen der Datei Direktiven hinzu, um Tag-Hilfshilfen und die Komponenten der App im Ordner "Freigegeben " zu verwenden:

    @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
    @using {APPLICATION ASSEMBLY}.Shared
    

    Ersetzen Sie {APPLICATION ASSEMBLY} den Assemblynamen der App durch den Namen der App.

  • Fügen Sie dem <head> Inhalt ein Tag und Blazor stylesheet <base><link> hinzu:

    <base href="~/" />
    <link rel="stylesheet" href="~/css/site.css" />
    
  • Ändern Sie den Inhalt des <body> Tags in folgendes:

    <div class="sidebar" style="float:left">
        <component type="typeof(NavMenu_IdentityLayout)" 
            render-mode="ServerPrerendered" />
    </div>
    
    <div class="main" style="padding-left:250px">
        <div class="top-row px-4">
            @{
                var result = Engine.FindView(ViewContext, "_LoginPartial", 
                    isMainPage: false);
            }
            @if (result.Success)
            {
                await Html.RenderPartialAsync("_LoginPartial");
            }
            else
            {
                throw new InvalidOperationException("The default Identity UI " +
                    "layout requires a partial view '_LoginPartial'.");
            }
            <a href="https://learn.microsoft.com/aspnet/" target="_blank">About</a>
        </div>
    
        <div class="content px-4">
            @RenderBody()
        </div>
    </div>
    
    <script src="~/Identity/lib/jquery/dist/jquery.js"></script>
    <script src="~/Identity/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
    <script src="~/Identity/js/site.js" asp-append-version="true"></script>
    @RenderSection("Scripts", required: false)
    <script src="_framework/blazor.server.js"></script>
    

Identity Gerüst in ein Blazor Server Projekt mit Autorisierung

Führen Sie das Identity Gerüst aus:

  • Klicken Sie aus Projektmappen-Explorer mit der rechten Maustaste auf das Projekt >">Neues Gerüst hinzufügen".
  • Wählen Sie im linken Bereich des Dialogfelds "Neues Gerüst hinzufügen " die Option aus Identity. Wählen Sie im mittleren Bereich aus Identity . Wählen Sie die Schaltfläche Hinzufügen aus.
  • Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus.
    • Wählen Sie ihre vorhandene Layoutseite aus, sodass Ihre Layoutdatei nicht mit falschem Markup überschrieben wird. Wenn eine vorhandene _Layout.cshtml Datei ausgewählt ist, wird sie nicht überschrieben. Beispiel:
      • ~/Pages/Shared/_Layout.cshtml für Razor Seiten oder Blazor Server Projekte mit vorhandener Razor Seiteninfrastruktur.
      • ~/Views/Shared/_Layout.cshtml für MVC-Projekte oder Blazor Server Projekte mit vorhandener MVC-Infrastruktur.
  • Wenn Sie Ihren vorhandenen Datenkontext verwenden möchten, wählen Sie mindestens eine Datei aus, um sie außer Kraft zu setzen. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
    • Wählen Sie Ihre Datenkontextklasse aus.
    • Wählen Sie Hinzufügen.
  • So erstellen Sie einen neuen Benutzerkontext und erstellen Möglicherweise eine benutzerdefinierte Benutzerklasse für Identity:
    • Wählen Sie die + Schaltfläche aus, um eine neue Datenkontextklasse zu erstellen. Akzeptieren Sie den Standardwert oder geben Sie eine Klasse an (z MyApplication.Data.ApplicationDbContext. B. ).
    • Wählen Sie Hinzufügen.

Hinweis: Wenn Sie einen neuen Benutzerkontext erstellen, müssen Sie keine Datei auswählen, die überschrieben werden soll.

Führen Sie das Identity Gerüst aus:

  • Klicken Sie aus Projektmappen-Explorer mit der rechten Maustaste auf das Projekt >">Neues Gerüst hinzufügen".
  • Wählen Sie im linken Bereich des Dialogfelds "Gerüst hinzufügen" die Option "Hinzufügen" ausIdentity>.
  • Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus.
    • Wählen Sie ihre vorhandene Layoutseite aus, sodass Ihre Layoutdatei nicht mit falschem Markup überschrieben wird. Wenn eine vorhandene _Layout.cshtml-Datei ausgewählt ist, wird sie nicht überschrieben. Beispiel:
      • ~/Pages/Shared/_Layout.cshtml für Razor Seiten oder Blazor Server Projekte mit vorhandener Razor Pages-Infrastruktur
      • ~/Views/Shared/_Layout.cshtml für MVC-Projekte oder Blazor Server -Projekte mit vorhandener MVC-Infrastruktur
  • Wenn Sie Ihren vorhandenen Datenkontext verwenden möchten, wählen Sie mindestens eine Datei aus, um sie außer Kraft zu setzen. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
    • Wählen Sie Ihre Datenkontextklasse aus.
    • Wählen Sie Hinzufügen.
  • So erstellen Sie einen neuen Benutzerkontext und erstellen möglicherweise eine benutzerdefinierte Benutzerklasse für Identity:
    • Wählen Sie die + Schaltfläche aus, um eine neue Datenkontextklasse zu erstellen. Akzeptieren Sie den Standardwert, oder geben Sie eine Klasse an (z. B MyApplication.Data.ApplicationDbContext. ).
    • Wählen Sie Hinzufügen.

Hinweis: Wenn Sie einen neuen Benutzerkontext erstellen, müssen Sie keine Datei auswählen, die überschreiben soll.

Einige Identity Optionen sind in Areas/Identity/IdentityHostingStartup.cs. Weitere Informationen finden Sie unter IHostingStartup.

Eigenständige oder gehostete Blazor WebAssembly Apps

Clientseitige Blazor WebAssembly Apps verwenden eigene Identity UI-Ansätze und können ASP.NET Core Identity Gerüste nicht verwenden. Serverseitige ASP.NET Core Apps gehosteter Blazor Lösungen können den Razor Anleitungen "Pages/MVC" in diesem Artikel folgen und wie jede andere Art von ASP.NET Core App konfiguriert werden, die unterstützt Identitywird.

Das Blazor Framework enthält Razor keine Komponentenversionen von Identity UI-Seiten. Identity Ui-Komponenten Razor können benutzerdefinierte erstellt oder aus nicht unterstützten Drittanbieterquellen abgerufen werden.

Weitere Informationen finden Sie in den Blazor Sicherheits- und Identity Artikeln.

Erstellen einer vollständigen Identity UI-Quelle

Um die vollständige Kontrolle über die Identity Benutzeroberfläche zu erhalten, führen Sie das Identity Gerüst aus, und wählen Sie "Alle Dateien überschreiben" aus.

Der folgende hervorgehobene Code zeigt die Änderungen, um die Standardbenutzeroberfläche IdentityIdentity durch eine ASP.NET Core 2.1-Web-App zu ersetzen. Möglicherweise möchten Sie dies tun, um vollständige Kontrolle über die Identity Benutzeroberfläche zu haben.

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

Der Standardwert Identity wird im folgenden Code ersetzt:

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

Der folgende Code legt die LoginPath, LogoutPathund AccessDeniedPath):

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

Registrieren Sie eine IEmailSender Implementierung, z. B.:

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

Kennwortkonfiguration

Wenn PasswordOptions sie in Startup.ConfigureServicesder Attributkonfiguration konfiguriert sind, [StringLength] ist möglicherweise für die Password Eigenschaft in Gerüstseiten Identity erforderlich. InputModelPassword Eigenschaften werden in den folgenden Dateien gefunden:

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

Deaktivieren einer Seite

In diesem Abschnitt wird gezeigt, wie Sie die Registerseite deaktivieren, aber der Ansatz kann verwendet werden, um eine beliebige Seite zu deaktivieren.

So deaktivieren Sie die Benutzerregistrierung:

  • IdentityGerüst . Schließen Sie "Account.Register", "Account.Login" und "Account.RegisterConfirmation" ein. Beispiel:

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  • Aktualisieren Sie Areas/Identity/Pages/Account/Register.cshtml.cs , damit Benutzer sich nicht von diesem Endpunkt registrieren können:

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • Aktualisieren Areas/Identity/Pages/Account/Register.cshtml , um mit den vorherigen Änderungen konsistent zu sein:

    @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>
    
  • Kommentieren oder Entfernen des Registrierungslinks Areas/Identity/Pages/Account/Login.cshtml

    @*
    <p>
        <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
    </p>
    *@
    
  • Aktualisieren der Seite "Bereiche/Identity/Seiten/Account/RegisterConfirmation" .

    • Entfernen Sie den Code und Links aus der cshtml-Datei.
    • Entfernen Sie den Bestätigungscode aus dem PageModel:
    [AllowAnonymous]
      public class RegisterConfirmationModel : PageModel
      {
          public IActionResult OnGet()
          {  
              return Page();
          }
      }
    

Verwenden einer anderen App zum Hinzufügen von Benutzern

Stellen Sie einen Mechanismus bereit, um Benutzer außerhalb der Web-App hinzuzufügen. Optionen zum Hinzufügen von Benutzern umfassen:

  • Eine dedizierte Administratorweb-App.
  • Eine Konsolen-App.

Der folgende Code beschreibt einen Ansatz zum Hinzufügen von Benutzern:

  • Eine Liste der Benutzer wird im Arbeitsspeicher gelesen.
  • Für jeden Benutzer wird ein sicheres eindeutiges Kennwort generiert.
  • Der Benutzer wird der Identity Datenbank hinzugefügt.
  • Der Benutzer wird benachrichtigt und angewiesen, das Kennwort zu ändern.
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>();
            });
}

Der folgende Code beschreibt das Hinzufügen eines Benutzers:


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

Ein ähnlicher Ansatz kann für Produktionsszenarien befolgt werden.

Verhindern der Veröffentlichung statischer Identity Ressourcen

Informationen zum Verhindern der Veröffentlichung statischer Identity Ressourcen im Webstamm finden Sie in der Einführung in Identity ASP.NET Core.

Zusätzliche Ressourcen