Gerüst in Identity ASP.NET Core Projekten

Von Rick Anderson

ASP.NET Core stellt als ASP.NET Core IdentityKlassenbibliothekRazor zur Verfügung. Anwendungen, die enthalten Identity , können das Gerüst anwenden, um selektiv den Quellcode hinzuzufügen, der in der Klassenbibliothek IdentityRazor (RCL) enthalten 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 nicht die Standard-RCL zu verwenden, lesen Sie den Abschnitt Erstellen einer vollständigen BenutzeroberflächenquelleIdentity.

Anwendungen ohne Authentifizierung 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üstbau den Großteil des erforderlichen Codes generiert, müssen Sie Ihr Projekt aktualisieren, um den Vorgang abschließen zu können. In diesem Dokument werden die Schritte erläutert, die zum Ausführen eines Gerüstbauupdates Identity erforderlich sind.

Es wird empfohlen, ein Quellcodeverwaltungssystem zu verwenden, das Dateiunterschiede zeigt und ihnen das Sichern von Änderungen ermöglicht. Überprüfen Sie die Änderungen, nachdem Sie den Identity Gerüstbau ausgeführt haben.

Dienste sind erforderlich, wenn Two Factor Authentication, Kontobestätigung und Kennwortwiederherstellung sowie andere Sicherheitsfeatures mit verwendet werdenIdentity. Dienste oder Dienststubs werden beim Gerüstbau von nicht generiert Identity. Dienste zum Aktivieren dieser Features müssen manuell hinzugefügt werden. Weitere Informationen finden Sie beispielsweise unter E-Mail-Bestätigung erforderlich.

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

Erstellen eines Gerüsts Identity in einem Razor Projekt ohne vorhandene Autorisierung

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

Führen Sie Visual Studio Paket-Manager Console aus:

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

Führen Sie den Identity Gerüstbau aus:

  • Klicken Projektmappen-Explorer mit der rechten Maustaste auf das > Projekt HinzufügenNeues>Gerüstelement.
  • Wählen Sie im linken Bereich des Dialogfelds Neues Gerüstelement hinzufügen die Option Identity>Hinzufügen aus.
  • Wählen Sie im Identity Dialogfeld Hinzufügen die optionen aus, die Sie auswählen möchten.
    • Wählen Sie Ihre vorhandene Layoutseite aus, oder Ihre Layoutdatei wird mit falschem Markup überschrieben:
      • ~/Pages/Shared/_Layout.cshtml für Razor Pages
      • ~/Views/Shared/_Layout.cshtml für MVC-Projekte
      • Blazor Server -Apps, die über Blazor Server die Vorlage (blazorserver) erstellt wurden, Razor sind standardmäßig nicht für Pages oder MVC konfiguriert. Lassen Sie den Eintrag für die Layoutseite leer.
    • Wählen Sie die + Schaltfläche aus, um eine neue Datenkontextklasse zu erstellen. Übernehmen 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:

Führen Sie Visual Studio Paket-Manager Console aus:

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

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

Layoutänderungen

Optional: Fügen Sie der Layoutdatei den Anmeldenamen partial (_LoginPartial) 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"] - WebRPnoAuth2Auth</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.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.min.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

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

Erstellen eines Gerüsts Identity in einem Razor Projekt mit Autorisierung

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

Führen Sie Visual Studio Paket-Manager Console aus:

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

Führen Sie den Identity Gerüstbau aus:

  • Klicken Projektmappen-Explorer mit der rechten Maustaste auf das > Projekt HinzufügenNeues>Gerüstelement.
  • Wählen Sie im linken Bereich des Dialogfelds Neues Gerüstelement hinzufügen die Option aus Identity. Wählen Sie Identity im mittelpunkten Bereich aus. Wählen Sie die Schaltfläche Hinzufügen aus.
  • Wählen Sie im Identity Dialogfeld Hinzufügen die optionen aus, die Sie auswählen möchten.
    • Wählen Sie Ihre vorhandene Layoutseite aus, damit 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 Pages oder Projekte Blazor Server mit vorhandener Razor Pages-Infrastruktur.
      • ~/Views/Shared/_Layout.cshtml für MVC-Projekte oder - Blazor Server Projekte mit vorhandener MVC-Infrastruktur.
  • Um ihren vorhandenen Datenkontext zu verwenden, wählen Sie mindestens eine Datei aus, die überschrieben werden soll. 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 möglicherweise eine benutzerdefinierte Benutzerklasse für Identity:
    • Wählen Sie die + Schaltfläche aus, um eine neue Datenkontextklasse zu erstellen. Übernehmen 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 zu überschreibende Datei auswählen.

Führen Sie den Identity Gerüstbau aus:

  • Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt >HinzufügenNeues>Gerüstelement.
  • 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, damit Ihre Layoutdatei nicht mit falschem Markup überschrieben wird. Wenn eine vorhandene datei _Layout.cshtml ausgewählt ist, wird sie nicht überschrieben. Beispiel:
      • ~/Pages/Shared/_Layout.cshtmlfür Razor Seiten oder Blazor Server Projekte mit vorhandener Pages-Infrastruktur Razor
      • ~/Views/Shared/_Layout.cshtml für MVC-Projekte oder Blazor Server -Projekte mit vorhandener MVC-Infrastruktur
  • Um Ihren vorhandenen Datenkontext zu verwenden, wählen Sie mindestens eine zu überschreibende Datei aus. 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 möglicherweise eine benutzerdefinierte Benutzerklasse für Identity:
    • Wählen Sie die + Schaltfläche aus, um eine neue Datenkontextklasse zu erstellen. Übernehmen Sie den Standardwert, MyApplication.Data.ApplicationDbContextoder geben Sie eine Klasse an (z. B. ).
    • Wählen Sie Hinzufügen.

Hinweis: Wenn Sie einen neuen Benutzerkontext erstellen, müssen Sie keine Zu überschreibende Datei auswählen.

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

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

In der Visual Studio Paket-Manager Console:

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

Führen Sie den Identity Gerüstbau aus:

  • Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt >HinzufügenNeues>Gerüstelement.
  • 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 Pages
      • ~/Views/Shared/_Layout.cshtml für MVC-Projekte
      • Blazor Server -Apps, die aus der Blazor Server Vorlage (blazorserver) erstellt wurden, sind nicht standardmäßig für Razor Pages oder MVC konfiguriert. Lassen Sie den Layoutseiteneintrag leer.
    • Wählen Sie die + Schaltfläche aus, um eine neue Datenkontextklasse zu erstellen. Übernehmen Sie den Standardwert, MyApplication.Data.ApplicationDbContextoder geben Sie eine Klasse an (z. B. ).
  • Wählen Sie Hinzufügen.

Optional: Fügen Sie die Anmeldung teilweise (_LoginPartial) zur Views/Shared/_Layout.cshtml Datei 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"] - WebRPnoAuth2Auth</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.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.min.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

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

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 Console:

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

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

Fügen Sie MapRazorPages zu Program.cs hinzu, wie im folgenden hervorgehobenen Code gezeigt:

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

Gerüstbau Identity in ein MVC-Projekt mit Autorisierung

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

In der Visual Studio Paket-Manager Console:

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

Führen Sie den Identity Gerüstbau aus:

  • Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt >HinzufügenNeues>Gerüstelement.
  • 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, damit 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 Pages oder Blazor Server Projekte mit vorhandener Pages-Infrastruktur Razor .
      • ~/Views/Shared/_Layout.cshtml für MVC-Projekte oder Blazor Server -Projekte mit vorhandener MVC-Infrastruktur.
  • Um Ihren vorhandenen Datenkontext zu verwenden, wählen Sie mindestens eine zu überschreibende Datei aus. 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 möglicherweise eine benutzerdefinierte Benutzerklasse für Identity:
    • Wählen Sie die + Schaltfläche aus, um eine neue Datenkontextklasse zu erstellen. Übernehmen Sie den Standardwert, MyApplication.Data.ApplicationDbContextoder geben Sie eine Klasse an (z. B. ).
    • Wählen Sie Hinzufügen.

Hinweis: Wenn Sie einen neuen Benutzerkontext erstellen, müssen Sie keine Zu überschreibende Datei auswählen.

Führen Sie den Identity Gerüstbau aus:

  • Klicken Projektmappen-Explorer mit der rechten Maustaste auf das > Projekt HinzufügenNeues>Gerüstelement.
  • Wählen Sie im linken Bereich des Dialogfelds Gerüst hinzufügen die Option Identity>Hinzufügen aus.
  • Wählen Sie im Identity Dialogfeld Hinzufügen die optionen aus, die Sie auswählen möchten.
    • Wählen Sie Ihre vorhandene Layoutseite aus, damit Ihre Layoutdatei nicht mit falschem Markup überschrieben wird. Wenn eine vorhandene datei _Layout.cshtml ausgewählt wird, wird sie nicht überschrieben. Beispiel:
      • ~/Pages/Shared/_Layout.cshtml für Razor Pages oder Projekte Blazor Server mit vorhandener Razor Pages-Infrastruktur
      • ~/Views/Shared/_Layout.cshtml für MVC-Projekte oder - Blazor Server Projekte mit vorhandener MVC-Infrastruktur
  • Um ihren vorhandenen Datenkontext zu verwenden, wählen Sie mindestens eine Datei aus, die überschrieben werden soll. 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 möglicherweise eine benutzerdefinierte Benutzerklasse für Identity:
    • Wählen Sie die + Schaltfläche aus, um eine neue Datenkontextklasse zu erstellen. Übernehmen 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 zu überschreibende Datei auswählen.

Erstellen eines Gerüsts Identity in einem Blazor Server Projekt

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

Führen Sie Visual Studio Paket-Manager Console aus:

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

Führen Sie den Identity Gerüstbau aus:

  • Klicken Projektmappen-Explorer mit der rechten Maustaste auf das > Projekt HinzufügenNeues>Gerüstelement.
  • Wählen Sie im linken Bereich des Dialogfelds Neues Gerüstelement hinzufügen die Option aus Identity. Wählen Sie Identity im mittelpunkten Bereich aus. Wählen Sie die Schaltfläche Hinzufügen aus.
  • Wählen Sie im Identity Dialogfeld Hinzufügen die optionen aus, die Sie auswählen möchten.
    • Wählen Sie Ihre vorhandene Layoutseite aus, damit 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 Pages oder Projekte Blazor Server mit vorhandener Razor Pages-Infrastruktur.
      • ~/Views/Shared/_Layout.cshtml für MVC-Projekte oder - Blazor Server Projekte mit vorhandener MVC-Infrastruktur.
  • Um ihren vorhandenen Datenkontext zu verwenden, wählen Sie mindestens eine Datei aus, die überschrieben werden soll. 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 möglicherweise eine benutzerdefinierte Benutzerklasse für Identity:
    • Wählen Sie die + Schaltfläche aus, um eine neue Datenkontextklasse zu erstellen. Übernehmen 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 zu überschreibende Datei auswählen.

Führen Sie den Identity Gerüstbau aus:

  • Klicken Projektmappen-Explorer mit der rechten Maustaste auf das > Projekt HinzufügenNeues>Gerüstelement.
  • Wählen Sie im linken Bereich des Dialogfelds Gerüst hinzufügen die Option Identity>Hinzufügen aus.
  • Wählen Sie im Identity Dialogfeld Hinzufügen die optionen aus, die Sie auswählen möchten.
    • Wählen Sie Ihre vorhandene Layoutseite aus, damit Ihre Layoutdatei nicht mit falschem Markup überschrieben wird. Wenn eine vorhandene datei _Layout.cshtml ausgewählt wird, wird sie nicht überschrieben. Beispiel:
      • ~/Pages/Shared/_Layout.cshtml für Razor Pages oder Projekte Blazor Server mit vorhandener Razor Pages-Infrastruktur
      • ~/Views/Shared/_Layout.cshtml für MVC-Projekte oder - Blazor Server Projekte mit vorhandener MVC-Infrastruktur
  • Um ihren vorhandenen Datenkontext zu verwenden, wählen Sie mindestens eine Datei aus, die überschrieben werden soll. 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 möglicherweise eine benutzerdefinierte Benutzerklasse für Identity:
    • Wählen Sie die + Schaltfläche aus, um eine neue Datenkontextklasse zu erstellen. Übernehmen 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 Zu überschreibende Datei auswählen.

Migrationen

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 Console:

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

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

Übergeben eines XSRF-Tokens an die App

Token können an Komponenten übergeben werden:

  • Wenn Authentifizierungstoken bereitgestellt und in der Authentifizierung cookiegespeichert werden, können sie an Komponenten übergeben werden.
  • Razor-Komponenten können nicht direkt verwendet werdenHttpContext, sodass es keine Möglichkeit gibt, ein XSRF-Token (Anti-Request Forgery) für POST an den Abmeldeendpunkt von unter /Identity/Account/LogoutabzurufenIdentity. 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 ein, nachdem Sie es den InitialApplicationState Klassen und TokenProvider hinzugefügt haben:

@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf

...

var tokens = new InitialApplicationState
{
    ...

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

Aktualisieren Sie die App -Komponente (App.razor), um zuzuweisen InitialState.XsrfToken:

@inject TokenProvider TokenProvider

...

TokenProvider.XsrfToken = InitialState.XsrfToken;

Der TokenProvider in diesem Thema veranschaulichte Dienst wird in der LoginDisplay -Komponente im folgenden Abschnitt Layout- und Authentifizierungsflussänderungen verwendet.

Registrieren des Tokenanbieterdiensts

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

builder.Services.AddScoped<TokenProvider>();

Änderungen am Layout- und Authentifizierungsfluss

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

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

Fügen Sie dem Ordner der App Shared eine LoginDisplay Komponente (LoginDisplay.razor) hinzu. Ein TokenanbieterdienstTokenProvider stellt im folgenden Beispiel das XSRF-Token für das HTML-Formular bereit, das post an Identityden Abmeldeendpunkt von stellt:

@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 MainLayout Komponente (Shared/MainLayout.razor) die LoginDisplay Komponente dem Inhalt des Elements der obersten Zeile <div> hinzu:

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

Formatauthentifizierungsendpunkte

Da Blazor Server Seitenseiten Identity verwendetRazor, ändert sich die Formatierung der Benutzeroberfläche, wenn ein Besucher zwischen Identity Seiten und Komponenten navigiert. Sie haben zwei Möglichkeiten, um die inkonsementen Stile zu beheben:

Erstellen von Identity Komponenten

Ein Ansatz zur Verwendung von Komponenten für Identity anstelle von Seiten ist das Erstellen Identity von Komponenten. Da SignInManager und UserManager in Razor Komponenten nicht unterstützt werden, verwenden Sie API-Endpunkte in der Blazor Server App, um Benutzerkontenaktionen zu verarbeiten.

Verwenden eines benutzerdefinierten Layouts mit Blazor App-Stilen

Das Identity Seitenlayout und die Stile können so geändert werden, dass Seiten erzeugt werden, die das Standarddesign Blazor verwenden.

Hinweis

Das Beispiel in diesem Abschnitt ist lediglich ein Ausgangspunkt für die Anpassung. Für eine optimale Benutzererfahrung ist wahrscheinlich zusätzliche Arbeit erforderlich.

Erstellen Sie eine neue NavMenu_IdentityLayout Komponente (Shared/NavMenu_IdentityLayout.razor). Verwenden Sie für das Markup und den Code der Komponente den gleichen 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 Komponente für Komponenten fehlschlagen, die RedirectToLogin eine Authentifizierung oder Autorisierung erfordern.

Nehmen Sie in der Pages/Shared/Layout.cshtml Datei die folgenden Änderungen vor:

  • Fügen Sie Razor am Anfang der Datei -Anweisungen hinzu, um Taghilfselemente und die Komponenten der App im Shared Ordner zu verwenden:

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

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

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

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

    <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://docs.microsoft.com/aspnet/" target="_blank">About</a>
        </div>
    
        <div class="content px-4">
            @RenderBody()
        </div>
    </div>
    
    <script src="~/Identity/lib/jquery/dist/jquery.min.js"></script>
    <script src="~/Identity/lib/bootstrap/dist/js/bootstrap.bundle.min.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 ihre eigenen Identity Ui-Ansätze und können kein Gerüst verwenden ASP.NET Core Identity . Serverseitige ASP.NET Core-Apps gehosteter Blazor Lösungen können den Razor Pages/MVC-Anleitungen in diesem Artikel folgen und werden wie jede andere Art von ASP.NET Core-App konfiguriert, die unterstütztIdentity.

Das Blazor Framework enthält Razor keine Komponentenversionen von Identity Benutzeroberflächenseiten. Identity Benutzeroberflächenkomponenten Razor können benutzerdefiniert erstellt oder aus nicht unterstützten Drittanbieterquellen abgerufen werden.

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

Erstellen einer vollständigen Identity Ui-Quelle

Um die vollständige Kontrolle über die Identity Benutzeroberfläche zu behalten, führen Sie den Identity Gerüstbau aus, und wählen Sie Alle Dateien überschreiben aus.

Kennwortkonfiguration

Wenn PasswordOptions in Startup.ConfigureServiceskonfiguriert ist, [StringLength] ist möglicherweise die Attributkonfiguration für die Password -Eigenschaft auf Gerüstseiten Identity erforderlich. InputModelPassword -Eigenschaften befinden sich in den folgenden Dateien:

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

Deaktivieren einer Seite

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

So deaktivieren Sie die Benutzerregistrierung:

  • Gerüstbau Identity. 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 sich Benutzer nicht über diesen Endpunkt registrieren können:

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • Aktualisieren Sie 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 Sie den Registrierungslink aus, oder entfernen Sie den Link. 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 Areas/Identity/Pages/Account/RegisterConfirmation .

    • Entfernen Sie den Code und die Links aus der CSHTML-Datei.
    • Entfernen Sie den Bestätigungscode aus :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. Zu den Optionen zum Hinzufügen von Benutzern gehören:

  • Eine dedizierte Administrator-Web-App.
  • Eine Konsolen-App.

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

  • Eine Liste von Benutzern wird in den Arbeitsspeicher eingelesen.
  • Für jeden Benutzer wird ein sicheres eindeutiges Kennwort 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;
}

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 unter Einführung in Identity ASP.NET Core.

ASP.NET Core stellt ASP.NET Core Identity als Razor Klassenbibliothek bereit. Anwendungen, die enthalten Identity , können den Gerüstbau anwenden, um selektiv den Quellcode hinzuzufügen, der in der IdentityRazor Klassenbibliothek (RCL) enthalten 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 nicht die Standard-RCL zu verwenden, lesen Sie den Abschnitt Erstellen einer vollständigen BenutzeroberflächenquelleIdentity.

Anwendungen ohne Authentifizierung 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üstbau den Großteil des erforderlichen Codes generiert, müssen Sie Ihr Projekt aktualisieren, um den Vorgang abschließen zu können. In diesem Dokument werden die Schritte erläutert, die zum Ausführen eines Gerüstbauupdates Identity erforderlich sind.

Es wird empfohlen, ein Quellcodeverwaltungssystem zu verwenden, das Dateiunterschiede zeigt und ihnen das Sichern von Änderungen ermöglicht. Überprüfen Sie die Änderungen, nachdem Sie den Identity Gerüstbau ausgeführt haben.

Dienste sind erforderlich, wenn Two Factor Authentication, Kontobestätigung und Kennwortwiederherstellung sowie andere Sicherheitsfeatures mit verwendet werdenIdentity. Dienste oder Dienststubs werden beim Gerüstbau von nicht generiert Identity. Dienste zum Aktivieren dieser Features müssen manuell hinzugefügt werden. Weitere Informationen finden Sie beispielsweise unter E-Mail-Bestätigung erforderlich.

Beim Erstellen eines Gerüsts Identity mit einem neuen Datenkontext in ein Projekt mit vorhandenen einzelnen Konten:

  • Entfernen Sie in Startup.ConfigureServicesdie Aufrufe von:
    • AddDbContext
    • AddDefaultIdentity

Beispielsweise werden und AddDbContextAddDefaultIdentity im folgenden Code auskommentiert:

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

Im vorangehenden Code wird der Code, der dupliziert wird, auskommentiert. Areas/Identity/IdentityHostingStartup.cs

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

Erstellen eines Gerüsts Identity in ein leeres Projekt

Führen Sie den Identity Gerüstbau aus:

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

Aktualisieren Sie die Startup -Klasse mit Code ähnlich dem folgenden:

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

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:

Führen Sie Visual Studio Paket-Manager Console aus:

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

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

Erstellen eines Gerüsts Identity in einem Razor Projekt ohne vorhandene Autorisierung

Führen Sie den Identity Gerüstbau aus:

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

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

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:

Führen Sie Visual Studio Paket-Manager Console aus:

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

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

Authentifizierung aktivieren

Aktualisieren Sie die Startup -Klasse mit Code ähnlich dem folgenden:

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

Layoutänderungen

Optional: Fügen Sie der Layoutdatei den Anmeldenamen partial (_LoginPartial) 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.min.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.min.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

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

Erstellen eines Gerüsts Identity in einem Razor Projekt mit Autorisierung

Führen Sie den Identity Gerüstbau aus:

  • Klicken Projektmappen-Explorer mit der rechten Maustaste auf das > Projekt HinzufügenNeues>Gerüstelement.
  • Wählen Sie im linken Bereich des Dialogfelds Neues Gerüstelement hinzufügen die Option aus Identity. Wählen Sie Identity im mittelpunkten Bereich aus. Wählen Sie die Schaltfläche Hinzufügen aus.
  • Wählen Sie im Identity Dialogfeld Hinzufügen die optionen aus, die Sie auswählen möchten.
    • Wählen Sie Ihre vorhandene Layoutseite aus, damit 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 Pages oder Projekte Blazor Server mit vorhandener Razor Pages-Infrastruktur.
      • ~/Views/Shared/_Layout.cshtml für MVC-Projekte oder - Blazor Server Projekte mit vorhandener MVC-Infrastruktur.
  • Um ihren vorhandenen Datenkontext zu verwenden, wählen Sie mindestens eine Datei aus, die überschrieben werden soll. 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 möglicherweise eine benutzerdefinierte Benutzerklasse für Identity:
    • Wählen Sie die + Schaltfläche aus, um eine neue Datenkontextklasse zu erstellen. Übernehmen 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 zu überschreibende Datei auswählen.

Führen Sie den Identity Gerüstbau aus:

  • Klicken Projektmappen-Explorer mit der rechten Maustaste auf das > Projekt HinzufügenNeues>Gerüstelement.
  • Wählen Sie im linken Bereich des Dialogfelds Gerüst hinzufügen die Option Identity>Hinzufügen aus.
  • Wählen Sie im Identity Dialogfeld Hinzufügen die optionen aus, die Sie auswählen möchten.
    • Wählen Sie Ihre vorhandene Layoutseite aus, damit Ihre Layoutdatei nicht mit falschem Markup überschrieben wird. Wenn eine vorhandene datei _Layout.cshtml ausgewählt wird, wird sie nicht überschrieben. Beispiel:
      • ~/Pages/Shared/_Layout.cshtml für Razor Pages oder Projekte Blazor Server mit vorhandener Razor Pages-Infrastruktur
      • ~/Views/Shared/_Layout.cshtml für MVC-Projekte oder - Blazor Server Projekte mit vorhandener MVC-Infrastruktur
  • Um ihren vorhandenen Datenkontext zu verwenden, wählen Sie mindestens eine Datei aus, die überschrieben werden soll. 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 möglicherweise eine benutzerdefinierte Benutzerklasse für Identity:
    • Wählen Sie die + Schaltfläche aus, um eine neue Datenkontextklasse zu erstellen. Übernehmen 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 zu überschreibende Datei auswählen.

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

Erstellen eines Gerüsts Identity in einem MVC-Projekt ohne vorhandene Autorisierung

Führen Sie den Identity Gerüstbau aus:

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

Optional: Fügen Sie der Datei den Anmeldenamen partielle (_LoginPartial) Views/Shared/_Layout.cshtml 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.min.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.min.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

    @RenderSection("Scripts", required: false)
</body>
</html>
  • Verschieben der Datei Pages/Shared/_LoginPartial.cshtml in Views/Shared/_LoginPartial.cshtml

Identity wird in konfiguriert Areas/Identity/IdentityHostingStartup.cs. 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:

Führen Sie Visual Studio Paket-Manager Console aus:

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

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

Aktualisieren Sie die Startup -Klasse mit Code ähnlich dem folgenden:

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

Erstellen eines Gerüsts Identity in einem MVC-Projekt mit Autorisierung

Führen Sie den Identity Gerüstbau aus:

  • Klicken Projektmappen-Explorer mit der rechten Maustaste auf das > Projekt HinzufügenNeues>Gerüstelement.
  • Wählen Sie im linken Bereich des Dialogfelds Neues Gerüstelement hinzufügen die Option aus Identity. Wählen Sie Identity im mittelpunkten Bereich aus. Wählen Sie die Schaltfläche Hinzufügen aus.
  • Wählen Sie im Identity Dialogfeld Hinzufügen die optionen aus, die Sie auswählen möchten.
    • Wählen Sie Ihre vorhandene Layoutseite aus, damit 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 Pages oder Projekte Blazor Server mit vorhandener Razor Pages-Infrastruktur.
      • ~/Views/Shared/_Layout.cshtml für MVC-Projekte oder - Blazor Server Projekte mit vorhandener MVC-Infrastruktur.
  • Um ihren vorhandenen Datenkontext zu verwenden, wählen Sie mindestens eine Datei aus, die überschrieben werden soll. 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 möglicherweise eine benutzerdefinierte Benutzerklasse für Identity:
    • Wählen Sie die + Schaltfläche aus, um eine neue Datenkontextklasse zu erstellen. Übernehmen 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 zu überschreibende Datei auswählen.

Führen Sie den Identity Gerüstbau aus:

  • Klicken Projektmappen-Explorer mit der rechten Maustaste auf das > Projekt HinzufügenNeues>Gerüstelement.
  • Wählen Sie im linken Bereich des Dialogfelds Gerüst hinzufügen die Option Identity>Hinzufügen aus.
  • Wählen Sie im Identity Dialogfeld Hinzufügen die optionen aus, die Sie auswählen möchten.
    • Wählen Sie Ihre vorhandene Layoutseite aus, damit Ihre Layoutdatei nicht mit falschem Markup überschrieben wird. Wenn eine vorhandene datei _Layout.cshtml ausgewählt wird, wird sie nicht überschrieben. Beispiel:
      • ~/Pages/Shared/_Layout.cshtml für Razor Pages oder Projekte Blazor Server mit vorhandener Razor Pages-Infrastruktur
      • ~/Views/Shared/_Layout.cshtml für MVC-Projekte oder - Blazor Server Projekte mit vorhandener MVC-Infrastruktur
  • Um ihren vorhandenen Datenkontext zu verwenden, wählen Sie mindestens eine Datei aus, die überschrieben werden soll. 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 möglicherweise eine benutzerdefinierte Benutzerklasse für Identity:
    • Wählen Sie die + Schaltfläche aus, um eine neue Datenkontextklasse zu erstellen. Übernehmen 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 zu überschreibende Datei auswählen.

Erstellen eines Gerüsts Identity in einem Blazor Server Projekt ohne vorhandene Autorisierung

Führen Sie den Identity Gerüstbau aus:

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

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

Migrationen

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 Console:

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

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

Übergeben eines XSRF-Tokens an die App

Token können an Komponenten übergeben werden:

  • Wenn Authentifizierungstoken bereitgestellt und in der Authentifizierung cookiegespeichert werden, können sie an Komponenten übergeben werden.
  • Razor-Komponenten können nicht direkt verwendet werdenHttpContext, sodass es keine Möglichkeit gibt, ein XSRF-Token (Anti-Request Forgery) für POST an den Abmeldeendpunkt von unter /Identity/Account/LogoutabzurufenIdentity. 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 ein, nachdem Sie es den InitialApplicationState Klassen und TokenProvider hinzugefügt haben:

@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf

...

var tokens = new InitialApplicationState
{
    ...

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

Aktualisieren Sie die App -Komponente (App.razor), um zuzuweisen InitialState.XsrfToken:

@inject TokenProvider TokenProvider

...

TokenProvider.XsrfToken = InitialState.XsrfToken;

Der TokenProvider in diesem Thema veranschaulichte Dienst wird in der LoginDisplay -Komponente im folgenden Abschnitt Layout- und Authentifizierungsflussänderungen verwendet.

Authentifizierung aktivieren

In der Startup-Klasse:

  • Vergewissern Sie sich, dass Razor Pages-Dienste in Startup.ConfigureServiceshinzugefügt werden.
  • Wenn Sie den TokenProvider verwenden, registrieren Sie den Dienst.
  • Rufen Sie UseDatabaseErrorPage im Anwendungs-Generator in Startup.Configure für die Entwicklungsumgebung auf.
  • Rufen Sie UseAuthentication und UseAuthorization nach UseRoutingauf.
  • Fügen Sie einen Endpunkt für Razor Pages 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, ist aber nicht erforderlich. Weitere Informationen finden Sie unter HTTP Strict Transport Security Protocol.

Änderungen am Layout- und Authentifizierungsfluss

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

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

Fügen Sie dem Ordner Freigegeben der App eine LoginDisplay Komponente (LoginDisplay.razor) hinzu. Der TokenProvider-Dienst stellt das XSRF-Token für das HTML-Formular bereit, das an den IdentityAbmeldeendpunkt von post:

@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 MainLayout Komponente (Shared/MainLayout.razor) die LoginDisplay Komponente dem Inhalt des Elements der obersten Zeile <div> hinzu:

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

Formatauthentifizierungsendpunkte

Da Blazor Server Seitenseiten Identity verwendetRazor, ändert sich die Formatierung der Benutzeroberfläche, wenn ein Besucher zwischen Identity Seiten und Komponenten navigiert. Sie haben zwei Möglichkeiten, um die inkonsementen Stile zu beheben:

Erstellen von Identity Komponenten

Ein Ansatz zur Verwendung von Komponenten für Identity anstelle von Seiten ist das Erstellen Identity von Komponenten. Da SignInManager und UserManager in Razor Komponenten nicht unterstützt werden, verwenden Sie API-Endpunkte in der Blazor Server App, um Benutzerkontenaktionen zu verarbeiten.

Verwenden eines benutzerdefinierten Layouts mit Blazor App-Stilen

Das Identity Seitenlayout und die Stile können so geändert werden, dass Seiten erzeugt werden, die das Standarddesign Blazor verwenden.

Hinweis

Das Beispiel in diesem Abschnitt ist lediglich ein Ausgangspunkt für die Anpassung. Für eine optimale Benutzererfahrung ist wahrscheinlich zusätzliche Arbeit erforderlich.

Erstellen Sie eine neue NavMenu_IdentityLayout Komponente (Shared/NavMenu_IdentityLayout.razor). Verwenden Sie für das Markup und den Code der Komponente den gleichen 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 Komponente für Komponenten fehlschlagen, die RedirectToLogin eine Authentifizierung oder Autorisierung erfordern.

Nehmen Sie in der Pages/Shared/Layout.cshtml Datei die folgenden Änderungen vor:

  • Fügen Sie Razor am Anfang der Datei -Anweisungen hinzu, um Taghilfselemente und die Komponenten der App im Ordner Shared zu verwenden:

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

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

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

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

    <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://docs.microsoft.com/aspnet/" target="_blank">About</a>
        </div>
    
        <div class="content px-4">
            @RenderBody()
        </div>
    </div>
    
    <script src="~/Identity/lib/jquery/dist/jquery.min.js"></script>
    <script src="~/Identity/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
    <script src="~/Identity/js/site.js" asp-append-version="true"></script>
    @RenderSection("Scripts", required: false)
    <script src="_framework/blazor.server.js"></script>
    

Gerüstbau Identity in ein Blazor Server Projekt mit Autorisierung

Führen Sie den Identity Gerüstbau aus:

  • Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt >HinzufügenNeues>Gerüstelement.
  • 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, damit 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 Pages oder Blazor Server Projekte mit vorhandener Pages-Infrastruktur Razor .
      • ~/Views/Shared/_Layout.cshtml für MVC-Projekte oder Blazor Server -Projekte mit vorhandener MVC-Infrastruktur.
  • Um Ihren vorhandenen Datenkontext zu verwenden, wählen Sie mindestens eine zu überschreibende Datei aus. 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 möglicherweise eine benutzerdefinierte Benutzerklasse für Identity:
    • Wählen Sie die + Schaltfläche aus, um eine neue Datenkontextklasse zu erstellen. Übernehmen Sie den Standardwert, MyApplication.Data.ApplicationDbContextoder geben Sie eine Klasse an (z. B. ).
    • Wählen Sie Hinzufügen.

Hinweis: Wenn Sie einen neuen Benutzerkontext erstellen, müssen Sie keine Zu überschreibende Datei auswählen.

Führen Sie den Identity Gerüstbau aus:

  • Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt >HinzufügenNeues>Gerüstelement.
  • 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, damit Ihre Layoutdatei nicht mit falschem Markup überschrieben wird. Wenn eine vorhandene datei _Layout.cshtml ausgewählt ist, wird sie nicht überschrieben. Beispiel:
      • ~/Pages/Shared/_Layout.cshtmlfür Razor Seiten oder Blazor Server Projekte mit vorhandener Pages-Infrastruktur Razor
      • ~/Views/Shared/_Layout.cshtml für MVC-Projekte oder Blazor Server -Projekte mit vorhandener MVC-Infrastruktur
  • Um Ihren vorhandenen Datenkontext zu verwenden, wählen Sie mindestens eine zu überschreibende Datei aus. 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 möglicherweise eine benutzerdefinierte Benutzerklasse für Identity:
    • Wählen Sie die + Schaltfläche aus, um eine neue Datenkontextklasse zu erstellen. Übernehmen Sie den Standardwert, MyApplication.Data.ApplicationDbContextoder geben Sie eine Klasse an (z. B. ).
    • Wählen Sie Hinzufügen.

Hinweis: Wenn Sie einen neuen Benutzerkontext erstellen, müssen Sie keine Zu überschreibende Datei auswählen.

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

Eigenständige oder gehostete Blazor WebAssembly Apps

Clientseitige Blazor WebAssembly Apps verwenden ihre eigenen Identity Ui-Ansätze und können kein Gerüst verwenden ASP.NET Core Identity . Serverseitige ASP.NET Core-Apps gehosteter Blazor Lösungen können den Razor Pages/MVC-Anleitungen in diesem Artikel folgen und werden wie jede andere Art von ASP.NET Core-App konfiguriert, die unterstütztIdentity.

Das Blazor Framework enthält Razor keine Komponentenversionen von Identity Benutzeroberflächenseiten. Identity Benutzeroberflächenkomponenten Razor können benutzerdefiniert erstellt oder aus nicht unterstützten Drittanbieterquellen abgerufen werden.

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

Erstellen einer vollständigen Identity Ui-Quelle

Um die vollständige Kontrolle über die Identity Benutzeroberfläche zu behalten, führen Sie den Identity Gerüstbau aus, und wählen Sie Alle Dateien überschreiben aus.

Der folgende hervorgehobene Code zeigt die Änderungen, durch die die Standard-Benutzeroberfläche IdentityIdentity in einer ASP.NET Core 2.1-Web-App ersetzt werden soll. Sie können dies tun, um die 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 , LoginPathLogoutPathund AccessDeniedPathfest:

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 in Startup.ConfigureServiceskonfiguriert ist, [StringLength] ist möglicherweise die Attributkonfiguration für die Password -Eigenschaft auf Gerüstseiten Identity erforderlich. InputModelPassword -Eigenschaften befinden sich in den folgenden Dateien:

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

Deaktivieren einer Seite

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

So deaktivieren Sie die Benutzerregistrierung:

  • Gerüstbau Identity. 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 sich Benutzer nicht über diesen Endpunkt registrieren können:

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • Aktualisieren Sie 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 Sie den Registrierungslink aus, oder entfernen Sie den Link. 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 Areas/Identity/Pages/Account/RegisterConfirmation .

    • Entfernen Sie den Code und die Links aus der CSHTML-Datei.
    • Entfernen Sie den Bestätigungscode aus :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. Zu den Optionen zum Hinzufügen von Benutzern gehören:

  • Eine dedizierte Administrator-Web-App.
  • Eine Konsolen-App.

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

  • Eine Liste von Benutzern wird in den Arbeitsspeicher eingelesen.
  • Für jeden Benutzer wird ein sicheres eindeutiges Kennwort 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;
}

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 unter Einführung in Identity ASP.NET Core.

Zusätzliche Ressourcen