Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Von Rick Anderson
In diesem Artikel wird erläutert, wie Sie eine Datenbank migrieren und ein Identity Gerüstupdate abschließen.
Blazor Identity Gerüsterstellung
ASP.NET Core Identity-Gerüstbau fügt ASP.NET Core Identity zu Blazor Web Apps und Blazor Server-Apps hinzu. Nachdem das Gerüst die IdentityRazor Komponenten der App hinzugefügt hat, können Sie die Komponenten an Ihre Anwendungsanforderungen anpassen.
Obwohl der Scaffolder den erforderlichen C#-Code generiert, um Identity in der App zu erstellen, müssen Sie die Projektdatenbank mit einer Entity-Framework-Core-Datenbankmigration aktualisieren, um den Prozess abzuschließen. In diesem Artikel werden die Schritte zum Migrieren einer Datenbank beschrieben.
Überprüfen Sie nach dem Ausführen des Identity Gerüsts die Änderungen. Verwenden Sie GitHub oder ein anderes Quellcodeverwaltungssystem, das Dateiänderungen mit einem Feature zum Zurücksetzen von Änderungen anzeigt.
Dienste sind erforderlich, wenn Sie die Zwei-Faktor-Authentifizierung (2FA), die Kontobestätigung und Kennwortwiederherstellung sowie andere Sicherheitsfeatures mit Identity verwenden. Dienste oder Dienststubs werden beim Erstellen eines Gerüsts für Identity nicht generiert. Dienste zum Aktivieren dieser Features müssen manuell hinzugefügt werden.
Razor Pages und MVC Identity Gerüsterstellung
ASP.NET Core stellt ASP.NET Core Identity als Razor-Klassenbibliothek (RCL) bereit. Anwendungen, die über Identity verfügen, können das Gerüst anwenden, um den in der Identity-RCL enthaltenen Quellcode 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. Der angepasste Identity-Code setzt die Standardimplementierung der Identity-RCL außer Kraft. Um vollständige Kontrolle über die Benutzeroberfläche zu erhalten, ohne die Standard-RCL zu verwenden, lesen Sie den Abschnitt Erstellen einer vollständigen Identity-Quelle für die Benutzeroberfläche.
Anwendungen, die keine Authentifizierung enthalten, können den Scaffolder verwenden, um das RCL-Paket Identity hinzuzufügen. Sie können den zu generierenden Identity Code auswählen.
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 Artikel werden die Schritte beschrieben, die zum Abschließen eines Identity Gerüstupdates erforderlich sind. Überprüfen Sie nach dem Ausführen des Identity Gerüsts die Änderungen. Verwenden Sie ein Quellcodeverwaltungssystem, das Dateiunterschiede anzeigt und Es Ihnen ermöglicht, änderungen zu deaktivieren.
Dienste sind bei Verwendung von 2FA, Kontobestätigung und Kennwortwiederherstellung und anderen Sicherheitsfeatures mit Identityerforderlich. Dienste oder Dienststubs werden beim Erstellen eines Gerüsts für Identity nicht generiert. Dienste zum Aktivieren dieser Features müssen manuell hinzugefügt werden. Weitere Informationen finden Sie unter Konfigurieren eines E-Mail-Anbieters , damit die App eine E-Mail-Bestätigung anfordern kann.
In der Regel sollten Apps, die mit einzelnen Konten erstellt wurden, keinen neuen Datenkontext erstellen.
Einbinden von Identity in einem Blazor-Projekt
Die in diesem Abschnitt beschriebenen Verfahren zur Gerüsterstellung gelten für Blazor Web Apps und Blazor Server-Apps.
Führen Sie den Identity-Scaffolder aus:
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie Add>New Scaffolded Item aus.
Wählen Sie im linken Bereich des Dialogfelds " Neues Gerüstelement hinzufügen " die Option Identityaus.
Wählen Sie im mittleren Bereich Blazor Identity aus, und wählen Sie dann Hinzufügen aus.
Im Dialogfeld Hinzufügen BlazorIdentity:
Wählen Sie das Plussymbol (+) aus, und fügen Sie die Datenbankkontextklasse DbContext hinzu.
Wählen Sie den Datenbankanbieter (Datenbankanbieter) aus, der standardmäßig auf SQL Server festgelegt ist.
Wählen Sie das Plus-Symbol (+) aus, und fügen Sie die Benutzerklasse Benutzerklasse hinzu.
Wählen Sie Hinzufügen aus.
Der generierte Identity-Datenbankcode erfordert Entity Framework Core Migrationen. Die folgenden Schritte erklären, wie Sie eine Migration erstellen und auf die Datenbank anwenden.
Visual Studio Connected Services werden verwendet, um eine Entity Framework Core Migration hinzuzufügen und die Datenbank zu aktualisieren.
Doppelklicken Sie im Projektmappen-Explorer auf Verbundene Dienste.
Wählen Sie im Bereich SQL Server Express LocalDB von Service-AbhängigkeitenWeitere Aktionen (...) >Migration hinzufügen aus.
Geben Sie der Migration einen Migrationsnamen z. B.
CreateIdentitySchema. Dies ist ein Name, der die Migration beschreibt.Warten Sie, bis der Datenbankkontext im Feld DbContext-Klassennamen geladen wird. Die Aktion kann einige Sekunden dauern.
Wählen Sie "Fertig stellen" aus, um das Update abzuschließen. Wählen Sie nach Abschluss des Vorgangs "Schließen" aus.
Weitere Aktionen auswählen (...) >Datenbank aktualisieren.
Das Dialogfeld Datenbank mit der neuesten Migration aktualisieren wird geöffnet.
Warten Sie darauf, dass das Feld DbContext-Klassennamen aktualisiert wird und dass frühere Migrationen geladen werden. Die Aktion kann einige Sekunden dauern.
Wählen Sie "Fertig stellen" aus, um das Update abzuschließen. Wählen Sie nach Abschluss des Vorgangs "Schließen" aus.
Der Befehl „update database“ führt die Migrationen der Methode Up aus, die nicht in einer vom Scaffolder erstellten Migrationscodedatei angewendet werden. In diesem Fall führt der Befehl die Up Methode in der Migrations /{TIME STAMP}_{MIGRATION NAME}.cs Datei aus, die die Identity Tabellen, Einschränkungen und Indizes erstellt. Der Platzhalter {TIME STAMP} ist ein Zeitstempel, und der Platzhalter {MIGRATION NAME} ist der Migrationsname.
Clientseitige Blazor-Apps (Eigenständige Blazor WebAssembly)
Clientseitige Blazor-Apps (eigenständige Blazor WebAssembly) verwenden eigene Identity-UI-Ansätze und können ASP.NET Core Identity-Scaffolding nicht verwenden.
Weitere Informationen finden Sie in den Artikeln zu Blazor Sicherheit und Identity.
Identity in ein Razor-Projekt ohne bestehende Autorisierung einbinden
Installieren Sie die Microsoft. VisualStudio.Web.CodeGeneration.Design NuGet-Paket.
Hinweis
Eine Anleitung zum Hinzufügen von Paketen zu .NET-Anwendungen finden Sie in den Artikeln unter Pakete installieren und verwalten unter Workflow für die Paketnutzung (NuGet-Dokumentation). Überprüfen Sie unter NuGet.org, ob die richtige Paketversion verwendet wird.
Führen Sie das Identity Gerüst mit den folgenden Verfahren aus.
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie Add>New Scaffolded Item aus.
Wählen Sie im linken Bereich des Dialogfelds " Neues Gerüstelement hinzufügen " die Option Identityaus.
Wählen Sie im mittleren Bereich Identity und dann Hinzufügen aus.
Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus:
Wenn Sie über eine vorhandene angepasste Layoutseite für Identity (_Layout.cshtml) verfügen, wählen Sie die vorhandene Seite aus, um zu vermeiden, dass Ihr Layout durch das Gerüst mit falschem Markup überschrieben wird. Wählen Sie beispielsweise eine der folgenden Optionen aus:
- 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.
Wählen Sie das Plussymbol (+) aus, und fügen Sie die Datenbankkontextklasse DbContext hinzu. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
Um einen Datenkontext zu erstellen, wählen Sie das Plussymbol (+). Übernehmen Sie den Standardwert, oder geben Sie eine neue Klasse für Identity.
Um eine neue Benutzerklasse zu erstellen, wählen Sie das Plussymbol (+) für die Benutzerklasse aus, und geben Sie die Klasse an (z
ContosoUser. B. für ein Unternehmen mit dem Namen "Contoso").
Wählen Sie "Hinzufügen" aus, um das Gerüst auszuführen.
Migrationen, UseAuthentication und Layout
Der generierte Identity-Datenbankcode erfordert Entity Framework Core Migrationen. Wenn eine Migration zum Generieren des Identity Schemas noch nicht erstellt und auf die Datenbank angewendet wird, verwenden Sie die folgenden Verfahren, um eine Migration zu erstellen und die Datenbank zu aktualisieren.
Visual Studio Connected Services wird verwendet, um eine EF Core-Migration hinzuzufügen und die Datenbank zu aktualisieren.
Doppelklicken Sie im Projektmappen-Explorer auf Verbundene Dienste.
Wählen Sie im Bereich SQL Server Express LocalDB von Service-AbhängigkeitenWeitere Aktionen (...) >Migration hinzufügen aus.
Geben Sie der Migration einen Migrationsnamen z. B.
CreateIdentitySchema. Dies ist ein Name, der die Migration beschreibt.Warten Sie, bis der Datenbankkontext im Feld DbContext-Klassennamen geladen wird. Die Aktion kann einige Sekunden dauern.
Wählen Sie "Fertig stellen" aus, um das Update abzuschließen. Wählen Sie nach Abschluss des Vorgangs "Schließen" aus.
Weitere Aktionen auswählen (...) >Datenbank aktualisieren.
Das Dialogfeld Datenbank mit der neuesten Migration aktualisieren wird geöffnet.
Warten Sie darauf, dass das Feld DbContext-Klassennamen aktualisiert wird und dass frühere Migrationen geladen werden. Die Aktion kann einige Sekunden dauern.
Wählen Sie "Fertig stellen" aus, um das Update abzuschließen. Wählen Sie nach Abschluss des Vorgangs "Schließen" aus.
Der Befehl „update database“ führt die Up-Methode für Migrationen aus, die in einer vom Scaffolder erstellten Migrationscodedatei noch nicht angewendet wurden. In diesem Fall führt der Befehl die Up Methode in der Migrations /{TIME STAMP}_{MIGRATION NAME}.cs Datei aus, die die Identity Tabellen, Einschränkungen und Indizes erstellt. Der Platzhalter {TIME STAMP} ist ein Zeitstempel, und der Platzhalter {MIGRATION NAME} ist der Migrationsname.
Wenn das Identity Schema erstellt, aber nicht auf die Datenbank angewendet wird, müssen Sie nur den Befehl ausführen, um die Datenbank zu aktualisieren:
Doppelklicken Sie im Projektmappen-Explorer auf Verbundene Dienste.
Wählen Sie im SQL Server Express LocalDB Bereich Service-AbhängigkeitenWeitere Aktionen (... ) >Update-Datenbank.
Das Dialogfeld Datenbank mit der neuesten Migration aktualisieren wird geöffnet.
Warten Sie darauf, dass das Feld DbContext-Klassennamen aktualisiert wird und dass frühere Migrationen geladen werden. Die Aktion kann einige Sekunden dauern.
Wählen Sie "Fertig stellen" aus, um das Update abzuschließen. Wählen Sie nach Abschluss des Vorgangs "Schließen" aus.
Sie können die Anwendung eines Identity-Schemas mit dem folgenden Befehl bestätigen. Die Ausgabe des Befehls enthält eine Spalte „applied“, die alle Migrationen enthält, die auf die Datenbank angewandt werden.
Führen Sie in der Visual Studio Paket-Manager Console den Befehl Get-Migration aus:
Get-Migration
Wenn mehrere Datenbankkontexte vorhanden sind, geben Sie den Kontext über den -Context-Parameter an.
Layoutänderungen
Optional können Sie das Login-Partial (_LoginPartial) zur Layoutdatei hinzufügen:
<!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">
© 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>
Ein Gerüst für Identity in ein Razor-Projekt mit Autorisierung einfügen
Installieren Sie die Microsoft. VisualStudio.Web.CodeGeneration.Design NuGet-Paket.
Hinweis
Eine Anleitung zum Hinzufügen von Paketen zu .NET-Anwendungen finden Sie in den Artikeln unter Pakete installieren und verwalten unter Workflow für die Paketnutzung (NuGet-Dokumentation). Überprüfen Sie unter NuGet.org, ob die richtige Paketversion verwendet wird.
Führen Sie das Identity Gerüst mit den folgenden Verfahren aus.
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie Add>New Scaffolded Item aus.
Wählen Sie im linken Bereich des Dialogfelds " Neues Gerüstelement hinzufügen " die Option Identityaus.
Wählen Sie im mittleren Bereich Identity und dann Hinzufügen aus.
Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus:
Wenn Sie über eine vorhandene angepasste Layoutseite für Identity (_Layout.cshtml) verfügen, wählen Sie die vorhandene Seite aus, um zu vermeiden, dass Ihr Layout durch das Gerüst mit falschem Markup überschrieben wird. Wählen Sie beispielsweise eine der folgenden Optionen aus:
- 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.
Wählen Sie das Plussymbol (+) aus, und fügen Sie die Datenbankkontextklasse DbContext hinzu. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
Um einen Datenkontext zu erstellen, wählen Sie das Plussymbol (+). Übernehmen Sie den Standardwert, oder geben Sie eine Klasse an (z. B.
Contoso.Data.ApplicationDbContextfür ein Unternehmen mit dem Namen „Contoso“).Um eine neue Benutzerklasse zu erstellen, wählen Sie das Plussymbol (+) für die Benutzerklasse aus, und geben Sie die Klasse an (z
ContosoUser. B. für ein Unternehmen mit dem Namen "Contoso").
Wählen Sie "Hinzufügen" aus, um das Gerüst auszuführen.
Erstellen eines Gerüsts für Identity in einem MVC-Projekt ohne vorhandene Autorisierung
Installieren Sie die Microsoft. VisualStudio.Web.CodeGeneration.Design NuGet-Paket.
Hinweis
Eine Anleitung zum Hinzufügen von Paketen zu .NET-Anwendungen finden Sie in den Artikeln unter Pakete installieren und verwalten unter Workflow für die Paketnutzung (NuGet-Dokumentation). Überprüfen Sie unter NuGet.org, ob die richtige Paketversion verwendet wird.
Führen Sie das Identity Gerüst mit den folgenden Verfahren aus.
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie Add>New Scaffolded Item aus.
Wählen Sie im linken Bereich des Dialogfelds " Neues Gerüstelement hinzufügen " die Option Identityaus.
Wählen Sie im mittleren Bereich Identity und dann Hinzufügen aus.
Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus:
Wenn Sie über eine vorhandene angepasste Layoutseite für Identity (_Layout.cshtml) verfügen, wählen Sie die vorhandene Seite aus, um zu vermeiden, dass Ihr Layout durch das Gerüst mit falschem Markup überschrieben wird. Wählen Sie beispielsweise eine der folgenden Optionen aus:
- 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.
Wählen Sie das Plussymbol (+) aus, und fügen Sie die Datenbankkontextklasse DbContext hinzu. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
Um einen Datenkontext zu erstellen, wählen Sie das Plussymbol (+). Übernehmen Sie den Standardwert, oder geben Sie eine neue Klasse für Identity.
Um eine neue Benutzerklasse zu erstellen, wählen Sie das Plussymbol (+) für die Benutzerklasse aus, und geben Sie die Klasse an (z
ContosoUser. B. für ein Unternehmen mit dem Namen "Contoso").
Wählen Sie "Hinzufügen" aus, um das Gerüst auszuführen.
Optional: Fügen Sie der Datei _LoginPartial den Anmeldeteil (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"] - 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">
© 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 Entity Framework Core Migrationen. Wenn eine Migration zum Generieren des Identity Schemas noch nicht erstellt und auf die Datenbank angewendet wird, verwenden Sie die folgenden Verfahren, um eine Migration zu erstellen und die Datenbank zu aktualisieren.
Visual Studio Connected Services wird verwendet, um eine EF Core-Migration hinzuzufügen und die Datenbank zu aktualisieren.
Doppelklicken Sie im Projektmappen-Explorer auf Verbundene Dienste.
Wählen Sie im Bereich SQL Server Express LocalDB von Service DependenciesWeitere Aktionen (...) >Migration hinzufügen aus.
Geben Sie der Migration einen Migrationsnamen z. B.
CreateIdentitySchema. Dies ist ein Name, der die Migration beschreibt.Warten Sie, bis der Datenbankkontext im Feld DbContext-Klassennamen geladen wird. Die Aktion kann einige Sekunden dauern.
Wählen Sie "Fertig stellen" aus, um das Update abzuschließen. Wählen Sie nach Abschluss des Vorgangs "Schließen" aus.
Weitere Aktionen auswählen (...) >Datenbank aktualisieren.
Das Dialogfeld Datenbank mit der neuesten Migration aktualisieren wird geöffnet.
Warten Sie darauf, dass das Feld DbContext-Klassennamen aktualisiert wird und dass frühere Migrationen geladen werden. Die Aktion kann einige Sekunden dauern.
Wählen Sie "Fertig stellen" aus, um das Update abzuschließen. Wählen Sie nach Abschluss des Vorgangs "Schließen" aus.
Der Befehl „update database“ führt die Up-Methodenmigrationen aus, die in einer vom Scaffolder erstellten Migrationscodedatei nicht angewendet wurden. In diesem Fall führt der Befehl die Up Methode in der Migrations /{TIME STAMP}_{MIGRATION NAME}.cs Datei aus, die die Identity Tabellen, Einschränkungen und Indizes erstellt. Der Platzhalter {TIME STAMP} ist ein Zeitstempel, und der Platzhalter {MIGRATION NAME} ist der Migrationsname.
Wenn das Identity Schema erstellt, aber nicht auf die Datenbank angewendet wird, müssen Sie nur den Befehl ausführen, um die Datenbank zu aktualisieren:
Doppelklicken Sie im Projektmappen-Explorer auf Verbundene Dienste.
Wählen Sie im SQL Server Express LocalDB Bereich Service-AbhängigkeitenWeitere Aktionen (... ) >Update-Datenbank.
Das Dialogfeld Datenbank mit der neuesten Migration aktualisieren wird geöffnet.
Warten Sie darauf, dass das Feld DbContext-Klassennamen aktualisiert wird und dass frühere Migrationen geladen werden. Die Aktion kann einige Sekunden dauern.
Wählen Sie "Fertig stellen" aus, um das Update abzuschließen. Wählen Sie nach Abschluss des Vorgangs "Schließen" aus.
Sie können die Anwendung eines Identity-Schemas mit dem folgenden Befehl bestätigen. Die Ausgabe des Befehls enthält eine Spalte „applied“, die alle Migrationen enthält, die auf die Datenbank angewandt werden.
Führen Sie in der Visual Studio Paket-Manager Console den Befehl Get-Migration aus:
Get-Migration
Wenn mehrere Datenbankkontexte vorhanden sind, geben Sie den Kontext über den -Context-Parameter an.
Fügen Sie MapRazorPages der datei Program.cs hinzu, wie im folgenden hervorgehobenen Code dargestellt:
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();
Erstellen eines Gerüsts für Identity in einem MVC-Projekt mit Autorisierung
Installieren Sie die Microsoft. VisualStudio.Web.CodeGeneration.Design NuGet-Paket.
Hinweis
Eine Anleitung zum Hinzufügen von Paketen zu .NET-Anwendungen finden Sie in den Artikeln unter Pakete installieren und verwalten unter Workflow für die Paketnutzung (NuGet-Dokumentation). Überprüfen Sie unter NuGet.org, ob die richtige Paketversion verwendet wird.
Führen Sie das Identity Gerüst mit den folgenden Verfahren aus.
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie Add>New Scaffolded Item aus.
Wählen Sie im linken Bereich des Dialogfelds " Neues Gerüstelement hinzufügen " die Option Identityaus.
Wählen Sie im mittleren Bereich Identity aus, und wählen Sie dann Hinzufügen aus.
Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus:
Wenn Sie über eine vorhandene angepasste Layoutseite für Identity (_Layout.cshtml) verfügen, wählen Sie die vorhandene Seite aus, um zu vermeiden, dass Ihr Layout durch das Gerüst mit falschem Markup überschrieben wird. Wählen Sie beispielsweise eine der folgenden Optionen aus:
- 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.
Wählen Sie das Plussymbol (+) aus, und fügen Sie die Datenbankkontextklasse DbContext hinzu. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
Um einen Datenkontext zu erstellen, wählen Sie das Plussymbol (+). Übernehmen Sie den Standardwert, oder geben Sie eine Klasse an (z. B.
Contoso.Data.ApplicationDbContextfür ein Unternehmen mit dem Namen „Contoso“).Um eine neue Benutzerklasse zu erstellen, wählen Sie das Plussymbol (+) für die Benutzerklasse aus, und geben Sie die Klasse an (z
ContosoUser. B. für ein Unternehmen mit dem Namen "Contoso").
Wählen Sie "Hinzufügen" aus, um das Gerüst auszuführen.
Vollständigen Identity UI-Quellcode erstellen
Um vollständige Kontrolle über die Identity-Benutzeroberfläche zu behalten, führen Sie das Identity-Gerüst aus und wählen Alle Dateien überschreiben aus.
Kennwortkonfiguration
Wenn PasswordOptions in Startup.ConfigureServices konfiguriert sind, ist die Konfiguration von StringLengthAttribute möglicherweise für die Eigenschaft Password in generierten Identity-Seiten erforderlich. Das InputModel und seine Password-Eigenschaften befinden sich in den folgenden Dateien:
- Bereiche/Identity/Seiten/Konto/Register.cshtml.cs
- Bereiche/Identity/Seiten/Konto/ResetPassword.cshtml.cs
Deaktivieren einer Seite
In diesem Abschnitt wird beschrieben, wie Sie die Registerseite deaktivieren, aber Sie können denselben Ansatz verwenden, um eine beliebige Seite zu deaktivieren.
So deaktivieren Sie die Benutzerregistrierung
Erstellen Sie ein Gerüst für Identity. Fügen Sie
Account.Register,Account.LoginundAccount.RegisterConfirmationein. Beispiel:dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"Aktualisieren Sie die Datei "Bereiche/Identity/Seiten/Konto/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 Sie die Datei "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 in der Datei Areas/Identity/Pages/Account/Login.cshtml aus oder entfernen Sie ihn:
@* <p> <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a> </p> *@Aktualisieren Sie die
Areas/Identity/Pages/Account/RegisterConfirmation-Seite.Entfernen Sie den Code und die Links aus der CSHTML-Datei .
Entfernen Sie den Bestätigungscode aus der
PageModelImplementierung:
[AllowAnonymous] public class RegisterConfirmationModel : PageModel { public IActionResult OnGet() { return Page(); } }
Verwenden einer anderen App zum Hinzufügen von Benutzer*innen
Stellen Sie einen Mechanismus zum Hinzufügen von Benutzer*innen außerhalb der Web-App bereit. Zu den Optionen zum Hinzufügen von Benutzer*innen gehören:
- Eine dedizierte Administratorweb-App
- Eine Konsolen-App
Der folgende Code beschreibt einen Ansatz zum Hinzufügen von Benutzern:
- Lesen Sie die Liste der Benutzer in den Arbeitsspeicher.
- Generieren Sie ein sicheres eindeutiges Kennwort für jeden Benutzer.
- Fügen Sie den Benutzer zur Identity Datenbank hinzu.
- Benachrichtigen Sie den Benutzer darüber, sein 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 veranschaulicht das Hinzufügen einzelner Benutzer*innen:
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 in Produktionsszenarien angewandt 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 in ASP.NET Core.
ASP.NET Core stellt ASP.NET Core Identity als Razor-Klassenbibliothek (RCL) bereit. Anwendungen, die über Identity verfügen, können das Gerüst anwenden, um den in der Identity-RCL enthaltenen Quellcode 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 entsprechenden Code in der Identity RCL. Um vollständige Kontrolle über die Benutzeroberfläche zu erhalten, ohne die Standard-RCL zu verwenden, lesen Sie den Abschnitt Erstellen einer vollständigen Identity-Quelle für die Benutzeroberfläche.
Anwendungen, die keine Authentifizierung enthalten, können den Scaffolder verwenden, um das RCL-Paket Identity hinzuzufügen. Sie haben die Möglichkeit, den zu generierenden Identity Code auszuwählen.
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 Updates des Identity-Gerüsts erforderlich sind.
Es wird empfohlen, ein Quellcodeverwaltungssystem zu verwenden, das Dateiunterschiede anzeigt und Ihnen ermöglicht, Änderungen zu verhindern. Überprüfen Sie die Änderungen, nachdem Sie das Identity-Gerüst ausgeführt haben.
Dienste sind erforderlich, wenn Sie die zweistufige Authentifizierung, die Kontobestätigung und Kennwortwiederherstellung sowie andere Sicherheitsfeatures mit Identity verwenden. Dienste oder Dienststubs werden beim Erstellen eines Gerüsts für Identity nicht generiert. Dienste zum Aktivieren dieser Features müssen manuell hinzugefügt werden. Weitere Informationen finden Sie z. B. unter Anfordern einer E-Mail-Bestätigung.
In der Regel sollten Apps, die mit einzelnen Konten erstellt wurden, keinen neuen Datenkontext erstellen.
Identity in ein Razor-Projekt ohne bestehende Autorisierung einbinden
Installieren Sie die Microsoft. VisualStudio.Web.CodeGeneration.Design NuGet-Paket.
Hinweis
Eine Anleitung zum Hinzufügen von Paketen zu .NET-Anwendungen finden Sie in den Artikeln unter Pakete installieren und verwalten unter Workflow für die Paketnutzung (NuGet-Dokumentation). Überprüfen Sie unter NuGet.org, ob die richtige Paketversion verwendet wird.
Führen Sie das Identity Gerüst mit den folgenden Verfahren aus.
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie Add>New Scaffolded Item aus.
Wählen Sie im linken Bereich des Dialogfelds " Neues Gerüstelement hinzufügen " die Option Identityaus.
Wählen Sie im mittleren Bereich Identity und dann Hinzufügen aus.
Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus:
Wenn Sie über eine vorhandene angepasste Layoutseite für Identity (_Layout.cshtml) verfügen, wählen Sie die vorhandene Seite aus, um zu vermeiden, dass Ihr Layout durch das Gerüst mit falschem Markup überschrieben wird. Wählen Sie beispielsweise eine der folgenden Optionen aus:
- 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.
Wählen Sie das Plussymbol (+) aus, und fügen Sie die Datenbankkontextklasse DbContext hinzu. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
Um einen Datenkontext zu erstellen, wählen Sie das Plussymbol (+). Übernehmen Sie den Standardwert, oder geben Sie eine neue Klasse für Identity.
Um eine neue Benutzerklasse zu erstellen, wählen Sie das Plussymbol (+) für die Benutzerklasse aus, und geben Sie die Klasse an (z
ContosoUser. B. für ein Unternehmen mit dem Namen "Contoso").
Wählen Sie "Hinzufügen" aus, um das Gerüst auszuführen.
Migrationen, UseAuthentication und Layout
Der generierte Identity-Datenbankcode erfordert Entity Framework Core Migrationen. Wenn eine Migration zum Generieren des Identity Schemas noch nicht erstellt und auf die Datenbank angewendet wird, verwenden Sie die folgenden Verfahren, um eine Migration zu erstellen und die Datenbank zu aktualisieren.
Visual Studio Connected Services wird verwendet, um eine EF Core-Migration hinzuzufügen und die Datenbank zu aktualisieren.
Doppelklicken Sie im Projektmappen-Explorer auf Verbundene Dienste.
Wählen Sie im Bereich SQL Server Express LocalDB von Service DependenciesWeitere Aktionen (...) >Migration hinzufügen.
Geben Sie der Migration einen Migrationsnamen z. B.
CreateIdentitySchema. Dies ist ein Name, der die Migration beschreibt.Warten Sie, bis der Datenbankkontext im Feld DbContext-Klassennamen geladen wird. Die Aktion kann einige Sekunden dauern.
Wählen Sie "Fertig stellen" aus, um das Update abzuschließen. Wählen Sie nach Abschluss des Vorgangs "Schließen" aus.
Weitere Aktionen auswählen (...) >Datenbank aktualisieren.
Das Dialogfeld Datenbank mit der neuesten Migration aktualisieren wird geöffnet.
Warten Sie darauf, dass das Feld DbContext-Klassennamen aktualisiert wird und dass frühere Migrationen geladen werden. Die Aktion kann einige Sekunden dauern.
Wählen Sie "Fertig stellen" aus, um das Update abzuschließen. Wählen Sie nach Abschluss des Vorgangs "Schließen" aus.
Der Befehl „Datenbank aktualisieren“ führt die Migrationen der Methode Up aus, die in einer vom Scaffolder erstellten Migrationscodedatei nicht angewendet werden. In diesem Fall führt der Befehl die Up Methode in der Migrations /{TIME STAMP}_{MIGRATION NAME}.cs Datei aus, die die Identity Tabellen, Einschränkungen und Indizes erstellt. Der Platzhalter {TIME STAMP} ist ein Zeitstempel, und der Platzhalter {MIGRATION NAME} ist der Migrationsname.
Wenn das Identity Schema erstellt, aber nicht auf die Datenbank angewendet wird, müssen Sie nur den Befehl ausführen, um die Datenbank zu aktualisieren:
Doppelklicken Sie im Projektmappen-Explorer auf Verbundene Dienste.
Wählen Sie im SQL Server Express LocalDB Bereich Service-AbhängigkeitenWeitere Aktionen (... ) >Update-Datenbank.
Das Dialogfeld Datenbank mit der neuesten Migration aktualisieren wird geöffnet.
Warten Sie darauf, dass das Feld DbContext-Klassennamen aktualisiert wird und dass frühere Migrationen geladen werden. Die Aktion kann einige Sekunden dauern.
Wählen Sie "Fertig stellen" aus, um das Update abzuschließen. Wählen Sie nach Abschluss des Vorgangs "Schließen" aus.
Sie können die Anwendung eines Identity-Schemas mit dem folgenden Befehl bestätigen. Die Ausgabe des Befehls enthält eine Spalte „applied“, die alle Migrationen enthält, die auf die Datenbank angewandt werden.
Führen Sie in der Visual Studio Paket-Manager Console den Befehl Get-Migration aus:
Get-Migration
Wenn mehrere Datenbankkontexte vorhanden sind, geben Sie den Kontext über den -Context-Parameter an.
Layoutänderungen
Optional: Fügen Sie der Layoutdatei den Anmeldeteil (_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.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">
© 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>
Ein Gerüst für Identity in ein Razor-Projekt mit Autorisierung einfügen
Installieren Sie die Microsoft. VisualStudio.Web.CodeGeneration.Design NuGet-Paket.
Hinweis
Eine Anleitung zum Hinzufügen von Paketen zu .NET-Anwendungen finden Sie in den Artikeln unter Pakete installieren und verwalten unter Workflow für die Paketnutzung (NuGet-Dokumentation). Überprüfen Sie unter NuGet.org, ob die richtige Paketversion verwendet wird.
Führen Sie das Identity Gerüst mit den folgenden Verfahren aus.
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie Add>New Scaffolded Item aus.
Wählen Sie im linken Bereich des Dialogfelds " Neues Gerüstelement hinzufügen " die Option Identityaus.
Wählen Sie im mittleren Bereich Identity und dann Hinzufügen aus.
Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus:
Wenn Sie über eine vorhandene angepasste Layoutseite für Identity (_Layout.cshtml) verfügen, wählen Sie die vorhandene Seite aus, um zu vermeiden, dass Ihr Layout durch das Gerüst mit falschem Markup überschrieben wird. Wählen Sie beispielsweise eine der folgenden Optionen aus:
- 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.
Wählen Sie das Plussymbol (+) aus, und fügen Sie die Datenbankkontextklasse DbContext hinzu. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
Um einen Datenkontext zu erstellen, wählen Sie das Plussymbol (+). Übernehmen Sie den Standardwert, oder geben Sie eine Klasse an (z. B.
Contoso.Data.ApplicationDbContextfür ein Unternehmen mit dem Namen „Contoso“).Um eine neue Benutzerklasse zu erstellen, wählen Sie das Plussymbol (+) für die Benutzerklasse aus, und geben Sie die Klasse an (z
ContosoUser. B. für ein Unternehmen mit dem Namen "Contoso").
Wählen Sie "Hinzufügen" aus, um das Gerüst auszuführen.
Erstellen eines Gerüsts für Identity in einem MVC-Projekt ohne vorhandene Autorisierung
Installieren Sie die Microsoft. VisualStudio.Web.CodeGeneration.Design NuGet-Paket.
Hinweis
Eine Anleitung zum Hinzufügen von Paketen zu .NET-Anwendungen finden Sie in den Artikeln unter Pakete installieren und verwalten unter Workflow für die Paketnutzung (NuGet-Dokumentation). Überprüfen Sie unter NuGet.org, ob die richtige Paketversion verwendet wird.
Führen Sie das Identity Gerüst mit den folgenden Verfahren aus.
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie Add>New Scaffolded Item aus.
Wählen Sie im linken Bereich des Dialogfelds " Neues Gerüstelement hinzufügen " die Option Identityaus.
Wählen Sie im mittleren Bereich Identity und dann Hinzufügen aus.
Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus:
Wenn Sie über eine vorhandene angepasste Layoutseite für Identity (_Layout.cshtml) verfügen, wählen Sie die vorhandene Seite aus, um zu vermeiden, dass Ihr Layout durch das Gerüst mit falschem Markup überschrieben wird. Wählen Sie beispielsweise eine der folgenden Optionen aus:
- 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.
Wählen Sie das Plussymbol (+) aus, und fügen Sie die Datenbankkontextklasse DbContext hinzu. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
Um einen Datenkontext zu erstellen, wählen Sie das Plussymbol (+). Übernehmen Sie den Standardwert, oder geben Sie eine neue Klasse für Identity.
Um eine neue Benutzerklasse zu erstellen, wählen Sie das Plussymbol (+) für die Benutzerklasse aus, und geben Sie die Klasse an (z
ContosoUser. B. für ein Unternehmen mit dem Namen "Contoso").
Wählen Sie "Hinzufügen" aus, um das Gerüst auszuführen.
Optional: Fügen Sie der Datei _LoginPartial den Anmeldeteil (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"] - 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">
© 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 Entity Framework Core Migrationen. Wenn eine Migration zum Generieren des Identity Schemas noch nicht erstellt und auf die Datenbank angewendet wird, verwenden Sie die folgenden Verfahren, um eine Migration zu erstellen und die Datenbank zu aktualisieren.
Visual Studio Connected Services wird verwendet, um eine EF Core-Migration hinzuzufügen und die Datenbank zu aktualisieren.
Doppelklicken Sie im Projektmappen-Explorer auf Verbundene Dienste.
Wählen Sie im Bereich SQL Server Express LocalDB von Service DependenciesWeitere Aktionen (...) >Migration hinzufügen aus.
Geben Sie der Migration einen Migrationsnamen z. B.
CreateIdentitySchema. Dies ist ein Name, der die Migration beschreibt.Warten Sie, bis der Datenbankkontext im Feld DbContext-Klassennamen geladen wird. Die Aktion kann einige Sekunden dauern.
Wählen Sie "Fertig stellen" aus, um das Update abzuschließen. Wählen Sie nach Abschluss des Vorgangs "Schließen" aus.
Weitere Aktionen auswählen (...) >Datenbank aktualisieren.
Das Dialogfeld Datenbank mit der neuesten Migration aktualisieren wird geöffnet.
Warten Sie darauf, dass das Feld DbContext-Klassennamen aktualisiert wird und dass frühere Migrationen geladen werden. Die Aktion kann einige Sekunden dauern.
Wählen Sie "Fertig stellen" aus, um das Update abzuschließen. Wählen Sie nach Abschluss des Vorgangs "Schließen" aus.
Der Befehl „update database“ führt die Up-Methodenmigrationen aus, die in einer vom Scaffolder erstellten Migrationscodedatei nicht angewendet wurden. In diesem Fall führt der Befehl die Up Methode in der Migrations /{TIME STAMP}_{MIGRATION NAME}.cs Datei aus, die die Identity Tabellen, Einschränkungen und Indizes erstellt. Der Platzhalter {TIME STAMP} ist ein Zeitstempel, und der Platzhalter {MIGRATION NAME} ist der Migrationsname.
Wenn das Identity Schema erstellt, aber nicht auf die Datenbank angewendet wird, müssen Sie nur den Befehl ausführen, um die Datenbank zu aktualisieren:
Doppelklicken Sie im Projektmappen-Explorer auf Verbundene Dienste.
Wählen Sie im SQL Server Express LocalDB Bereich Service-AbhängigkeitenWeitere Aktionen (... ) >Update-Datenbank.
Das Dialogfeld Datenbank mit der neuesten Migration aktualisieren wird geöffnet.
Warten Sie darauf, dass das Feld DbContext-Klassennamen aktualisiert wird und dass frühere Migrationen geladen werden. Die Aktion kann einige Sekunden dauern.
Wählen Sie "Fertig stellen" aus, um das Update abzuschließen. Wählen Sie nach Abschluss des Vorgangs "Schließen" aus.
Sie können die Anwendung eines Identity-Schemas mit dem folgenden Befehl bestätigen. Die Ausgabe des Befehls enthält eine Spalte „applied“, die alle Migrationen enthält, die auf die Datenbank angewandt werden.
Führen Sie in der Visual Studio Paket-Manager Console den Befehl Get-Migration aus:
Get-Migration
Wenn mehrere Datenbankkontexte vorhanden sind, geben Sie den Kontext über den -Context-Parameter an.
Fügen Sie MapRazorPages in 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();
Erstellen eines Gerüsts für Identity in einem MVC-Projekt mit Autorisierung
Installieren Sie die Microsoft. VisualStudio.Web.CodeGeneration.Design NuGet-Paket.
Hinweis
Eine Anleitung zum Hinzufügen von Paketen zu .NET-Anwendungen finden Sie in den Artikeln unter Pakete installieren und verwalten unter Workflow für die Paketnutzung (NuGet-Dokumentation). Überprüfen Sie unter NuGet.org, ob die richtige Paketversion verwendet wird.
Führen Sie das Identity Gerüst mit den folgenden Verfahren aus.
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie Add>New Scaffolded Item aus.
Wählen Sie im linken Bereich des Dialogfelds " Neues Gerüstelement hinzufügen " die Option Identityaus.
Wählen Sie im mittleren Bereich Identity aus, und wählen Sie dann Hinzufügen aus.
Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus:
Wenn Sie über eine vorhandene angepasste Layoutseite für Identity (_Layout.cshtml) verfügen, wählen Sie die vorhandene Seite aus, um zu vermeiden, dass Ihr Layout durch das Gerüst mit falschem Markup überschrieben wird. Wählen Sie beispielsweise eine der folgenden Optionen aus:
- 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.
Wählen Sie das Plussymbol (+) aus, und fügen Sie die Datenbankkontextklasse DbContext hinzu. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
Um einen Datenkontext zu erstellen, wählen Sie das Plussymbol (+). Übernehmen Sie den Standardwert, oder geben Sie eine Klasse an (z. B.
Contoso.Data.ApplicationDbContextfür ein Unternehmen mit dem Namen „Contoso“).Um eine neue Benutzerklasse zu erstellen, wählen Sie das Plussymbol (+) für die Benutzerklasse aus, und geben Sie die Klasse an (z
ContosoUser. B. für ein Unternehmen mit dem Namen "Contoso").
Wählen Sie "Hinzufügen" aus, um das Gerüst auszuführen.
Identity in serverseitige Blazor-App mit Autorisierung integrieren
Installieren Sie die Microsoft. VisualStudio.Web.CodeGeneration.Design NuGet-Paket.
Hinweis
Eine Anleitung zum Hinzufügen von Paketen zu .NET-Anwendungen finden Sie in den Artikeln unter Pakete installieren und verwalten unter Workflow für die Paketnutzung (NuGet-Dokumentation). Überprüfen Sie unter NuGet.org, ob die richtige Paketversion verwendet wird.
Führen Sie das Identity Gerüst mit den folgenden Verfahren aus.
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie Add>New Scaffolded Item aus.
Wählen Sie im linken Bereich des Dialogfelds " Neues Gerüstelement hinzufügen " die Option Identityaus.
Wählen Sie im mittleren Bereich Identity und dann Hinzufügen aus.
Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus:
Wenn Sie über eine vorhandene angepasste Layoutseite für Identity (_Layout.cshtml) verfügen, wählen Sie die vorhandene Seite aus, um zu vermeiden, dass Ihr Layout durch das Gerüst mit falschem Markup überschrieben wird. Wählen Sie beispielsweise eine der folgenden Optionen aus:
- 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.
Wählen Sie das Plussymbol (+) aus, und fügen Sie die Datenbankkontextklasse DbContext hinzu. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
Um einen Datenkontext zu erstellen, wählen Sie das Plussymbol (+). Übernehmen Sie den Standardwert, oder geben Sie eine Klasse an (z. B.
Contoso.Data.ApplicationDbContextfür ein Unternehmen mit dem Namen „Contoso“).Um eine neue Benutzerklasse zu erstellen, wählen Sie das Plussymbol (+) für die Benutzerklasse aus, und geben Sie die Klasse an (z
ContosoUser. B. für ein Unternehmen mit dem Namen "Contoso").
Wählen Sie "Hinzufügen" aus, um das Gerüst auszuführen.
Migrationen
Der generierte Identity-Datenbankcode erfordert Entity Framework Core Migrationen. Wenn eine Migration zum Generieren des Identity Schemas noch nicht erstellt und auf die Datenbank angewendet wird, verwenden Sie die folgenden Verfahren, um eine Migration zu erstellen und die Datenbank zu aktualisieren.
Visual Studio Connected Services wird verwendet, um eine EF Core-Migration hinzuzufügen und die Datenbank zu aktualisieren.
Doppelklicken Sie im Projektmappen-Explorer auf Verbundene Dienste.
Wählen Sie im Bereich Service Dependencies von SQL Server Express LocalDBMore actions (...) >Add migration aus.
Geben Sie der Migration einen Migrationsnamen z. B.
CreateIdentitySchema. Dies ist ein Name, der die Migration beschreibt.Warten Sie, bis der Datenbankkontext im Feld DbContext-Klassennamen geladen wird. Die Aktion kann einige Sekunden dauern.
Wählen Sie "Fertig stellen" aus, um das Update abzuschließen. Wählen Sie nach Abschluss des Vorgangs "Schließen" aus.
Weitere Aktionen auswählen (...) >Datenbank aktualisieren.
Das Dialogfeld Datenbank mit der neuesten Migration aktualisieren wird geöffnet.
Warten Sie darauf, dass das Feld DbContext-Klassennamen aktualisiert wird und dass frühere Migrationen geladen werden. Die Aktion kann einige Sekunden dauern.
Wählen Sie "Fertig stellen" aus, um das Update abzuschließen. Wählen Sie nach Abschluss des Vorgangs "Schließen" aus.
Der Befehl „update database“ führt die Migrationen der Methode Up aus, die in einer vom Scaffolder erstellten Migrationscodedatei noch nicht angewendet wurden. In diesem Fall führt der Befehl die Up Methode in der Migrations /{TIME STAMP}_{MIGRATION NAME}.cs Datei aus, die die Identity Tabellen, Einschränkungen und Indizes erstellt. Der Platzhalter {TIME STAMP} ist ein Zeitstempel, und der Platzhalter {MIGRATION NAME} ist der Migrationsname.
Wenn das Identity Schema erstellt, aber nicht auf die Datenbank angewendet wird, müssen Sie nur den Befehl ausführen, um die Datenbank zu aktualisieren:
Doppelklicken Sie im Projektmappen-Explorer auf Verbundene Dienste.
Wählen Sie im SQL Server Express LocalDB Bereich Service-AbhängigkeitenWeitere Aktionen (... ) >Update-Datenbank.
Das Dialogfeld Datenbank mit der neuesten Migration aktualisieren wird geöffnet.
Warten Sie darauf, dass das Feld DbContext-Klassennamen aktualisiert wird und dass frühere Migrationen geladen werden. Die Aktion kann einige Sekunden dauern.
Wählen Sie "Fertig stellen" aus, um das Update abzuschließen. Wählen Sie nach Abschluss des Vorgangs "Schließen" aus.
Sie können die Anwendung eines Identity-Schemas mit dem folgenden Befehl bestätigen. Die Ausgabe des Befehls enthält eine Spalte „applied“, die alle Migrationen enthält, die auf die Datenbank angewandt werden.
Führen Sie in der Visual Studio Paket-Manager Console den Befehl Get-Migration aus:
Get-Migration
Wenn mehrere Datenbankkontexte vorhanden sind, geben Sie den Kontext über den -Context-Parameter an.
Gestaltung von Authentifizierungsendpunkten
Da serverseitige BlazorAnwendungen RazorPagesIdentity-Seiten verwenden, ändert sich das Styling der Benutzeroberfläche, wenn ein Besucher zwischen IdentitySeiten und Komponenten navigiert. Sie haben zwei Optionen, um die nicht zusammenpassenden Stile anzugehen:
- Benutzerdefinierte Identity-Komponenten
- Verwenden Sie ein benutzerdefiniertes Layout mit Blazor-App-Formatvorlagen
Benutzerdefinierte Identity-Komponenten
ASP.NET Core Identity ist für die Arbeit im Kontext der HTTP-Anforderungs- und -Antwortkommunikation konzipiert, was nicht dem Modell in Blazor-Apps für die Kommunikation zwischen App-Client und -Server entspricht. ASP.NET Core-Apps, die ASP.NET Core Identity für die Benutzerverwaltung verwenden, sollten für die Razor-bezogene Benutzeroberfläche, wie Benutzerregistrierung, Anmelden, Abmelden und andere Benutzerverwaltungsaufgaben, Razor Seiten anstelle von Identity Komponenten verwenden.
Da SignInManager<TUser> und UserManager<TUser> in Razor-Komponenten nicht unterstützt werden, wird empfohlen, die Web-API zu verwenden, um Identity-Aktionen von Razor-Komponenten über eine serverseitige ASP.NET Core-App mit Identity zu verwalten. Einen Leitfaden zum Erstellen von Web-APIs für Blazor-Apps finden Sie unter Aufrufen einer Web-API über eine ASP.NET Core Blazor-App.
Ein Ansatz zur Verwendung von Razor-Komponenten für Identity anstelle von Razor Pages besteht darin, Ihre eigenen benutzerdefinierten IdentityRazor-Komponenten zu erstellen. Dieser Ansatz wird jedoch von Microsoft weder empfohlen noch unterstützt. Für zusätzlichen Kontext lesen Sie die folgenden Diskussionen. In den folgenden Erläuterungen werden Codebeispiele in Problemkommentaren und Codebeispiele, auf die in anderen Repositorys als Microsoft GitHub verwiesen wird, von Microsoft zwar nicht unterstützt, sie sind aber möglicherweise für einige Entwickler*innen hilfreich:
- Unterstützung der benutzerdefinierten Anmeldekomponente bei Verwendung von Identity (dotnet/aspnetcore #13601)
-
Erneute Klarstellung, dass
SigninManager<T>in Razor-Komponenten nicht unterstützt wird (dotnet/aspnetcore #34095) - Es sind keinerlei Informationen zur Implementierung eines benutzerdefinierten Anmeldeformulars für serverseitiges Blazor vorhanden (dotnet/AspNetCore.Docs #16813)
Für zusätzliche Unterstützung beim Erstellen benutzerdefinierter IdentityRazor-Komponenten oder beim Suchen nach Razor-Komponenten von Drittanbietern werden die folgenden Ressourcen empfohlen:
-
Stack Overflow (Tag:
blazor) (öffentliches Supportforum) - ASP.NET Core-Slack-Team (öffentlicher Supportchat)
- Blazor Gitter (öffentlicher Supportchat)
- Awesome Blazor (Links auf von der Community gepflegte Blazor-Ressourcen)
Verwenden Sie ein benutzerdefiniertes Layout mit Blazor-App-Stilen
Das Layout von Identity Pages und die Formatvorlagen können geändert werden, um Seiten zu erstellen, die Formatvorlagen verwenden, die dem Blazor-Standarddesign ähneln. Dieser Ansatz wird in der Dokumentation nicht behandelt.
Clientseitige Blazor-Apps
Clientseitige Blazor-Apps verwenden eigene Ansätze für die Identity-Benutzeroberfläche und können keine ASP.NET Core Identity-Gerüste verwenden. Serverseitige ASP.NET Core-Apps von gehosteten Blazor-Lösungen können den Anleitungen zu Razor Pages/MVC in diesem Artikel folgen und werden wie jeder andere Typ von ASP.NET Core-App konfiguriert, der Identity unterstützt.
Das Blazor-Framework enthält keine Razor-Komponentenversionen von Identity-Benutzeroberflächenseiten. Identity-Komponenten der Razor-Benutzeroberfläche können benutzerdefiniert erstellt oder aus nicht unterstützten Drittanbieterquellen abgerufen werden.
Weitere Informationen finden Sie in den Artikeln zu Blazor Sicherheit und Identity.
Vollständigen Identity UI-Quellcode erstellen
Um vollständige Kontrolle über die Identity-Benutzeroberfläche zu behalten, führen Sie das Identity-Gerüst aus und wählen Alle Dateien überschreiben aus.
Kennwortkonfiguration
Wenn PasswordOptions in Startup.ConfigureServiceskonfiguriert wurden, ist möglicherweise eine Konfiguration des [StringLength]-Attributs für die Password-Eigenschaft in Identity-Gerüstseiten erforderlich.
InputModel-Password-Eigenschaften finden Sie in den folgenden Dateien:
Areas/Identity/Pages/Account/Register.cshtml.csAreas/Identity/Pages/Account/ResetPassword.cshtml.cs
Deaktivieren einer Seite
In diesem Abschnitt wird gezeigt, wie Sie die Registrierungsseite deaktivieren. Dieser Ansatz kann aber dazu verwendet werden, jede Seite zu deaktivieren.
So deaktivieren Sie die Benutzerregistrierung
Erstellen Sie ein Gerüst für 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*innen 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 Konsistenz mit den vorherigen Änderungen zu erzielen:@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>Auskommentieren oder Entfernen des Registrierungslinks in
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
Areas/Identity/Pages/Account/RegisterConfirmation-Seite.- 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 Benutzer*innen
Stellen Sie einen Mechanismus zum Hinzufügen von Benutzer*innen außerhalb der Web-App bereit. Zu den Optionen zum Hinzufügen von Benutzer*innen gehören:
- Eine dedizierte Administrator-Web-App
- Eine Konsolen-App
Der folgende Code veranschaulicht einen Ansatz zum Hinzufügen von Benutzer*innen:
- Eine Liste von Benutzer*innen wird in den Arbeitsspeicher gelesen.
- Für alle Benutzer*innen wird ein sicheres eindeutiges Kennwort generiert.
- Die Benutzer*in wird zur Identity-Datenbank hinzugefügt.
- Die Benutzer*innen werden 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>();
});
}
Der folgende Code veranschaulicht das Hinzufügen einzelner Benutzer*innen:
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 in Produktionsszenarien angewandt 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 in ASP.NET Core.
ASP.NET Core stellt ASP.NET Core Identity als Razor-Klassenbibliothek (RCL) bereit. Anwendungen, die über Identity verfügen, können das Gerüst anwenden, um den in der Identity-RCL enthaltenen Quellcode 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 entsprechenden Code in der Identity RCL. Um vollständige Kontrolle über die Benutzeroberfläche zu erhalten, ohne die Standard-RCL zu verwenden, lesen Sie den Abschnitt Erstellen einer vollständigen Identity-Quelle für die Benutzeroberfläche.
Anwendungen, die keine Authentifizierung enthalten, können den Scaffolder verwenden, um das RCL-Paket Identity hinzuzufügen. Sie haben die Möglichkeit, den zu generierenden Identity Code auszuwählen.
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 Updates des Identity-Gerüsts erforderlich sind.
Es wird empfohlen, ein Quellcodeverwaltungssystem zu verwenden, das Dateiunterschiede anzeigt und Ihnen ermöglicht, Änderungen zu verhindern. Überprüfen Sie die Änderungen, nachdem Sie das Identity-Gerüst ausgeführt haben.
Dienste sind erforderlich, wenn Sie die zweistufige Authentifizierung, die Kontobestätigung und Kennwortwiederherstellung sowie andere Sicherheitsfeatures mit Identity verwenden. Dienste oder Dienststubs werden beim Erstellen eines Gerüsts für Identity nicht generiert. Dienste zum Aktivieren dieser Features müssen manuell hinzugefügt werden. Weitere Informationen finden Sie z. B. unter Anfordern einer E-Mail-Bestätigung.
Wenn Sie Identity mit einem neuen Datenkontext in ein Projekt mit bestehenden individuellen Konten einbauen, öffnen Sie Startup.ConfigureServices und entfernen Sie die Aufrufe zu:
AddDbContextAddDefaultIdentity
Im folgenden Code werden beispielsweise AddDbContext und AddDefaultIdentity 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 auskommentiert, der in Areas/Identity/IdentityHostingStartup.cs dupliziert ist.
In der Regel sollten Apps, die mit einzelnen Konten erstellt wurden, keinen neuen Datenkontext erstellen.
Erstellen eines Gerüsts für Identity in einem leeren Projekt
Führen Sie das Identity Gerüst mit den folgenden Verfahren aus.
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie Add>New Scaffolded Item aus.
Wählen Sie im linken Bereich des Dialogfelds " Neues Gerüstelement hinzufügen " die Option Identityaus.
Wählen Sie im mittleren Bereich Identity aus, und wählen Sie dann Hinzufügen aus.
Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus:
Wenn Sie über eine vorhandene angepasste Layoutseite für Identity (_Layout.cshtml) verfügen, wählen Sie die vorhandene Seite aus, um zu vermeiden, dass Ihr Layout durch das Gerüst mit falschem Markup überschrieben wird. Wählen Sie beispielsweise eine der folgenden Optionen aus:
- 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.
Wählen Sie das Plussymbol (+) aus, und fügen Sie die Datenbankkontextklasse DbContext hinzu. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
Um einen Datenkontext zu erstellen, wählen Sie das Plussymbol (+). Übernehmen Sie den Standardwert, oder geben Sie eine neue Klasse für Identity.
Um eine neue Benutzerklasse zu erstellen, wählen Sie das Plussymbol (+) für die Benutzerklasse aus, und geben Sie die Klasse an (z
ContosoUser. B. für ein Unternehmen mit dem Namen "Contoso").
Wählen Sie "Hinzufügen" aus, um das Gerüst auszuführen.
Aktualisieren Sie die Startup-Klasse mit Code, der dem folgenden ähnelt:
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();
});
}
}
Die Verwendung von UseHsts wird empfohlen, aber sie ist nicht zwingend erforderlich. Weitere Informationen finden Sie unter HTTP Strict Transport Security-Protokoll.
Der generierte Identity-Datenbankcode erfordert Entity Framework Core Migrationen. Wenn eine Migration zum Generieren des Identity Schemas noch nicht erstellt und auf die Datenbank angewendet wird, verwenden Sie die folgenden Verfahren, um eine Migration zu erstellen und die Datenbank zu aktualisieren.
Visual Studio Connected Services wird verwendet, um eine EF Core-Migration hinzuzufügen und die Datenbank zu aktualisieren.
Doppelklicken Sie im Projektmappen-Explorer auf Verbundene Dienste.
Wählen Sie im Bereich SQL Server Express LocalDB von Service-AbhängigkeitenWeitere Aktionen (...) >Migration hinzufügen aus.
Geben Sie der Migration einen Migrationsnamen z. B.
CreateIdentitySchema. Dies ist ein Name, der die Migration beschreibt.Warten Sie, bis der Datenbankkontext im Feld DbContext-Klassennamen geladen wird. Die Aktion kann einige Sekunden dauern.
Wählen Sie "Fertig stellen" aus, um das Update abzuschließen. Wählen Sie nach Abschluss des Vorgangs "Schließen" aus.
Weitere Aktionen auswählen (...) >Datenbank aktualisieren.
Das Dialogfeld Datenbank mit der neuesten Migration aktualisieren wird geöffnet.
Warten Sie darauf, dass das Feld DbContext-Klassennamen aktualisiert wird und dass frühere Migrationen geladen werden. Die Aktion kann einige Sekunden dauern.
Wählen Sie "Fertig stellen" aus, um das Update abzuschließen. Wählen Sie nach Abschluss des Vorgangs "Schließen" aus.
Der Befehl "Updatedatenbank" führt die Up Methodenmigrationen aus, die nicht in einer Migrationscodedatei angewendet werden, die vom Gerüst erstellt wurde. In diesem Fall führt der Befehl die Up Methode in der Migrations /{TIME STAMP}_{MIGRATION NAME}.cs Datei aus, die die Identity Tabellen, Einschränkungen und Indizes erstellt. Der Platzhalter {TIME STAMP} ist ein Zeitstempel, und der Platzhalter {MIGRATION NAME} ist der Migrationsname.
Wenn das Identity Schema erstellt, aber nicht auf die Datenbank angewendet wird, müssen Sie nur den Befehl ausführen, um die Datenbank zu aktualisieren:
Doppelklicken Sie im Projektmappen-Explorer auf Verbundene Dienste.
Wählen Sie im SQL Server Express LocalDB Bereich Service-AbhängigkeitenWeitere Aktionen (... ) >Update-Datenbank.
Das Dialogfeld Datenbank mit der neuesten Migration aktualisieren wird geöffnet.
Warten Sie darauf, dass das Feld DbContext-Klassennamen aktualisiert wird und dass frühere Migrationen geladen werden. Die Aktion kann einige Sekunden dauern.
Wählen Sie "Fertig stellen" aus, um das Update abzuschließen. Wählen Sie nach Abschluss des Vorgangs "Schließen" aus.
Sie können die Anwendung eines Identity-Schemas mit dem folgenden Befehl bestätigen. Die Ausgabe des Befehls enthält eine Spalte „applied“, die alle Migrationen enthält, die auf die Datenbank angewandt werden.
Führen Sie in der Visual Studio Paket-Manager Console den Befehl Get-Migration aus:
Get-Migration
Wenn mehrere Datenbankkontexte vorhanden sind, geben Sie den Kontext über den -Context-Parameter an.
Identity in ein Razor-Projekt ohne bestehende Autorisierung einbinden
Führen Sie das Identity Gerüst mit den folgenden Verfahren aus.
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie Add>New Scaffolded Item aus.
Wählen Sie im linken Bereich des Dialogfelds " Neues Gerüstelement hinzufügen " die Option Identityaus.
Wählen Sie im mittleren Bereich Identity und dann Hinzufügen aus.
Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus:
Wenn Sie über eine vorhandene angepasste Layoutseite für Identity (_Layout.cshtml) verfügen, wählen Sie die vorhandene Seite aus, um zu vermeiden, dass Ihr Layout durch das Gerüst mit falschem Markup überschrieben wird. Wählen Sie beispielsweise eine der folgenden Optionen aus:
- 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.
Wählen Sie das Plussymbol (+) aus, und fügen Sie die Datenbankkontextklasse DbContext hinzu. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
Um einen Datenkontext zu erstellen, wählen Sie das Plussymbol (+). Übernehmen Sie den Standardwert, oder geben Sie eine neue Klasse für Identity.
Um eine neue Benutzerklasse zu erstellen, wählen Sie das Plussymbol (+) für die Benutzerklasse aus, und geben Sie die Klasse an (z
ContosoUser. B. für ein Unternehmen mit dem Namen "Contoso").
Wählen Sie "Hinzufügen" aus, um das Gerüst auszuführen.
Identity wird in Areas/Identity/IdentityHostingStartup.cs konfiguriert. Weitere Informationen finden Sie unter IHostingStartup.
Migrationen, UseAuthentication und Layout
Der generierte Identity-Datenbankcode erfordert Entity Framework Core Migrationen. Wenn eine Migration zum Generieren des Identity Schemas noch nicht erstellt und auf die Datenbank angewendet wird, verwenden Sie die folgenden Verfahren, um eine Migration zu erstellen und die Datenbank zu aktualisieren.
Visual Studio Connected Services wird verwendet, um eine EF Core-Migration hinzuzufügen und die Datenbank zu aktualisieren.
Doppelklicken Sie im Projektmappen-Explorer auf Verbundene Dienste.
Wählen Sie im Bereich SQL Server Express LocalDB von Service-AbhängigkeitenWeitere Aktionen (...) >Migration hinzufügen aus.
Geben Sie der Migration einen Migrationsnamen z. B.
CreateIdentitySchema. Dies ist ein Name, der die Migration beschreibt.Warten Sie, bis der Datenbankkontext im Feld DbContext-Klassennamen geladen wird. Die Aktion kann einige Sekunden dauern.
Wählen Sie "Fertig stellen" aus, um das Update abzuschließen. Wählen Sie nach Abschluss des Vorgangs "Schließen" aus.
Weitere Aktionen auswählen (...) >Datenbank aktualisieren.
Das Dialogfeld Datenbank mit der neuesten Migration aktualisieren wird geöffnet.
Warten Sie darauf, dass das Feld DbContext-Klassennamen aktualisiert wird und dass frühere Migrationen geladen werden. Die Aktion kann einige Sekunden dauern.
Wählen Sie "Fertig stellen" aus, um das Update abzuschließen. Wählen Sie nach Abschluss des Vorgangs "Schließen" aus.
Der Befehl „update database“ führt die Up-Methode für Migrationen aus, die in einer vom Scaffolder erstellten Migrationscodedatei noch nicht angewendet wurden. In diesem Fall führt der Befehl die Up Methode in der Migrations /{TIME STAMP}_{MIGRATION NAME}.cs Datei aus, die die Identity Tabellen, Einschränkungen und Indizes erstellt. Der Platzhalter {TIME STAMP} ist ein Zeitstempel, und der Platzhalter {MIGRATION NAME} ist der Migrationsname.
Wenn das Identity Schema erstellt, aber nicht auf die Datenbank angewendet wird, müssen Sie nur den Befehl ausführen, um die Datenbank zu aktualisieren:
Doppelklicken Sie im Projektmappen-Explorer auf Verbundene Dienste.
Wählen Sie im SQL Server Express LocalDB Bereich Service-AbhängigkeitenWeitere Aktionen (... ) >Update-Datenbank.
Das Dialogfeld Datenbank mit der neuesten Migration aktualisieren wird geöffnet.
Warten Sie darauf, dass das Feld DbContext-Klassennamen aktualisiert wird und dass frühere Migrationen geladen werden. Die Aktion kann einige Sekunden dauern.
Wählen Sie "Fertig stellen" aus, um das Update abzuschließen. Wählen Sie nach Abschluss des Vorgangs "Schließen" aus.
Sie können die Anwendung eines Identity-Schemas mit dem folgenden Befehl bestätigen. Die Ausgabe des Befehls enthält eine Spalte „applied“, die alle Migrationen enthält, die auf die Datenbank angewandt werden.
Führen Sie in der Visual Studio Paket-Manager Console den Befehl Get-Migration aus:
Get-Migration
Wenn mehrere Datenbankkontexte vorhanden sind, geben Sie den Kontext über den -Context-Parameter an.
Authentifizierung aktivieren
Aktualisieren Sie die Startup-Klasse mit Code, der dem folgenden ähnelt:
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();
});
}
}
Die Verwendung von UseHsts wird empfohlen, aber sie ist nicht zwingend erforderlich. Weitere Informationen finden Sie unter HTTP Strict Transport Security-Protokoll.
Layoutänderungen
Optional: Fügen Sie der Layoutdatei den Anmeldeteil (_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.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">
© 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>
Ein Gerüst für Identity in ein Razor-Projekt mit Autorisierung einfügen
Führen Sie das Identity Gerüst mit den folgenden Verfahren aus.
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie Add>New Scaffolded Item aus.
Wählen Sie im linken Bereich des Dialogfelds " Neues Gerüstelement hinzufügen " die Option Identityaus.
Wählen Sie im mittleren Bereich Identity und dann Hinzufügen aus.
Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus:
Wenn Sie über eine vorhandene angepasste Layoutseite für Identity (_Layout.cshtml) verfügen, wählen Sie die vorhandene Seite aus, um zu vermeiden, dass Ihr Layout durch das Gerüst mit falschem Markup überschrieben wird. Wählen Sie beispielsweise eine der folgenden Optionen aus:
- 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.
Wählen Sie das Plussymbol (+) aus, und fügen Sie die Datenbankkontextklasse DbContext hinzu. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
Um einen Datenkontext zu erstellen, wählen Sie das Plussymbol (+). Übernehmen Sie den Standardwert, oder geben Sie eine Klasse an (z. B.
Contoso.Data.ApplicationDbContextfür ein Unternehmen mit dem Namen „Contoso“).Um eine neue Benutzerklasse zu erstellen, wählen Sie das Plussymbol (+) für die Benutzerklasse aus, und geben Sie die Klasse an (z
ContosoUser. B. für ein Unternehmen mit dem Namen "Contoso").
Wählen Sie "Hinzufügen" aus, um das Gerüst auszuführen.
Einige Identity-Optionen werden in Areas/Identity/IdentityHostingStartup.cs konfiguriert. Weitere Informationen finden Sie unter IHostingStartup.
Erstellen eines Gerüsts für Identity in einem MVC-Projekt ohne vorhandene Autorisierung
Führen Sie das Identity Gerüst mit den folgenden Verfahren aus.
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie Add>New Scaffolded Item aus.
Wählen Sie im linken Bereich des Dialogfelds " Neues Gerüstelement hinzufügen " die Option Identityaus.
Wählen Sie im mittleren Bereich Identity und dann Hinzufügen aus.
Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus:
Wenn Sie über eine vorhandene angepasste Layoutseite für Identity (_Layout.cshtml) verfügen, wählen Sie die vorhandene Seite aus, um zu vermeiden, dass Ihr Layout durch das Gerüst mit falschem Markup überschrieben wird. Wählen Sie beispielsweise eine der folgenden Optionen aus:
- 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.
Wählen Sie das Plussymbol (+) aus, und fügen Sie die Datenbankkontextklasse DbContext hinzu. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
Um einen Datenkontext zu erstellen, wählen Sie das Plussymbol (+). Übernehmen Sie den Standardwert, oder geben Sie eine neue Klasse für Identity.
Um eine neue Benutzerklasse zu erstellen, wählen Sie das Plussymbol (+) für die Benutzerklasse aus, und geben Sie die Klasse an (z
ContosoUser. B. für ein Unternehmen mit dem Namen "Contoso").
Wählen Sie "Hinzufügen" aus, um das Gerüst auszuführen.
Optional: Fügen Sie der Datei _LoginPartial den Anmeldeteil (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.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">
© 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 Sie die Datei Pages/Shared/_LoginPartial.cshtml nach 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. Wenn eine Migration zum Generieren des Identity Schemas noch nicht erstellt und auf die Datenbank angewendet wird, verwenden Sie die folgenden Verfahren, um eine Migration zu erstellen und die Datenbank zu aktualisieren.
Visual Studio Connected Services wird verwendet, um eine EF Core-Migration hinzuzufügen und die Datenbank zu aktualisieren.
Doppelklicken Sie im Projektmappen-Explorer auf Verbundene Dienste.
Wählen Sie im Bereich SQL Server Express LocalDB von Service DependenciesWeitere Aktionen (...) >Migration hinzufügen.
Geben Sie der Migration einen Migrationsnamen z. B.
CreateIdentitySchema. Dies ist ein Name, der die Migration beschreibt.Warten Sie, bis der Datenbankkontext im Feld DbContext-Klassennamen geladen wird. Die Aktion kann einige Sekunden dauern.
Wählen Sie "Fertig stellen" aus, um das Update abzuschließen. Wählen Sie nach Abschluss des Vorgangs "Schließen" aus.
Weitere Aktionen auswählen (...) >Datenbank aktualisieren.
Das Dialogfeld Datenbank mit der neuesten Migration aktualisieren wird geöffnet.
Warten Sie darauf, dass das Feld DbContext-Klassennamen aktualisiert wird und dass frühere Migrationen geladen werden. Die Aktion kann einige Sekunden dauern.
Wählen Sie "Fertig stellen" aus, um das Update abzuschließen. Wählen Sie nach Abschluss des Vorgangs "Schließen" aus.
Der Befehl „Datenbank aktualisieren“ führt die Migrationen der Methode Up aus, die in einer vom Scaffolder erstellten Migrationscodedatei nicht angewendet werden. In diesem Fall führt der Befehl die Up Methode in der Migrations /{TIME STAMP}_{MIGRATION NAME}.cs Datei aus, die die Identity Tabellen, Einschränkungen und Indizes erstellt. Der Platzhalter {TIME STAMP} ist ein Zeitstempel, und der Platzhalter {MIGRATION NAME} ist der Migrationsname.
Wenn das Identity Schema erstellt, aber nicht auf die Datenbank angewendet wird, müssen Sie nur den Befehl ausführen, um die Datenbank zu aktualisieren:
Doppelklicken Sie im Projektmappen-Explorer auf Verbundene Dienste.
Wählen Sie im SQL Server Express LocalDB Bereich Service-AbhängigkeitenWeitere Aktionen (... ) >Update-Datenbank.
Das Dialogfeld Datenbank mit der neuesten Migration aktualisieren wird geöffnet.
Warten Sie darauf, dass das Feld DbContext-Klassennamen aktualisiert wird und dass frühere Migrationen geladen werden. Die Aktion kann einige Sekunden dauern.
Wählen Sie "Fertig stellen" aus, um das Update abzuschließen. Wählen Sie nach Abschluss des Vorgangs "Schließen" aus.
Sie können die Anwendung eines Identity-Schemas mit dem folgenden Befehl bestätigen. Die Ausgabe des Befehls enthält eine Spalte „applied“, die alle Migrationen enthält, die auf die Datenbank angewandt werden.
Führen Sie in der Visual Studio Paket-Manager Console den Befehl Get-Migration aus:
Get-Migration
Wenn mehrere Datenbankkontexte vorhanden sind, geben Sie den Kontext über den -Context-Parameter an.
Aktualisieren Sie die Startup-Klasse mit Code, der dem folgenden ähnelt:
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();
});
}
}
Die Verwendung von UseHsts wird empfohlen, aber sie ist nicht zwingend erforderlich. Weitere Informationen finden Sie unter HTTP Strict Transport Security-Protokoll.
Erstellen eines Gerüsts für Identity in einem MVC-Projekt mit Autorisierung
Führen Sie das Identity Gerüst mit den folgenden Verfahren aus.
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie Add>New Scaffolded Item aus.
Wählen Sie im linken Bereich des Dialogfelds " Neues Gerüstelement hinzufügen " die Option Identityaus.
Wählen Sie im mittleren Bereich Identity aus, und wählen Sie dann Hinzufügen aus.
Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus:
Wenn Sie über eine vorhandene angepasste Layoutseite für Identity (_Layout.cshtml) verfügen, wählen Sie die vorhandene Seite aus, um zu vermeiden, dass Ihr Layout durch das Gerüst mit falschem Markup überschrieben wird. Wählen Sie beispielsweise eine der folgenden Optionen aus:
- 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.
Wählen Sie das Plussymbol (+) aus, und fügen Sie die Datenbankkontextklasse DbContext hinzu. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
Um einen Datenkontext zu erstellen, wählen Sie das Plussymbol (+). Übernehmen Sie den Standardwert, oder geben Sie eine Klasse an (z. B.
Contoso.Data.ApplicationDbContextfür ein Unternehmen mit dem Namen „Contoso“).Um eine neue Benutzerklasse zu erstellen, wählen Sie das Plussymbol (+) für die Benutzerklasse aus, und geben Sie die Klasse an (z
ContosoUser. B. für ein Unternehmen mit dem Namen "Contoso").
Wählen Sie "Hinzufügen" aus, um das Gerüst auszuführen.
Gerüst Identity in eine serverseitige Blazor-App ohne vorhandene Autorisierung einbinden
Führen Sie das Identity Gerüst mit den folgenden Verfahren aus.
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie Add>New Scaffolded Item aus.
Wählen Sie im linken Bereich des Dialogfelds " Neues Gerüstelement hinzufügen " die Option Identityaus.
Wählen Sie im mittleren Bereich Identity aus, und wählen Sie dann Hinzufügen aus.
Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus:
Wenn Sie über eine vorhandene angepasste Layoutseite für Identity (_Layout.cshtml) verfügen, wählen Sie die vorhandene Seite aus, um zu vermeiden, dass Ihr Layout durch das Gerüst mit falschem Markup überschrieben wird. Wählen Sie beispielsweise eine der folgenden Optionen aus:
- 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.
Wählen Sie das Plussymbol (+) aus, und fügen Sie die Datenbankkontextklasse DbContext hinzu. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
Um einen Datenkontext zu erstellen, wählen Sie das Plussymbol (+). Übernehmen Sie den Standardwert, oder geben Sie eine neue Klasse für Identity.
Um eine neue Benutzerklasse zu erstellen, wählen Sie das Plussymbol (+) für die Benutzerklasse aus, und geben Sie die Klasse an (z
ContosoUser. B. für ein Unternehmen mit dem Namen "Contoso").
Wählen Sie "Hinzufügen" aus, um das Gerüst auszuführen.
Identity wird in Areas/Identity/IdentityHostingStartup.cs konfiguriert. Weitere Informationen finden Sie unter IHostingStartup.
Migrationen
Der generierte Identity-Datenbankcode erfordert Entity Framework Core Migrationen. Wenn eine Migration zum Generieren des Identity Schemas noch nicht erstellt und auf die Datenbank angewendet wird, verwenden Sie die folgenden Verfahren, um eine Migration zu erstellen und die Datenbank zu aktualisieren.
Visual Studio Connected Services wird verwendet, um eine EF Core-Migration hinzuzufügen und die Datenbank zu aktualisieren.
Doppelklicken Sie im Projektmappen-Explorer auf Verbundene Dienste.
Wählen Sie im Bereich SQL Server Express LocalDB von Service DependenciesWeitere Aktionen (...) >Migration hinzufügen aus.
Geben Sie der Migration einen Migrationsnamen z. B.
CreateIdentitySchema. Dies ist ein Name, der die Migration beschreibt.Warten Sie, bis der Datenbankkontext im Feld DbContext-Klassennamen geladen wird. Die Aktion kann einige Sekunden dauern.
Wählen Sie "Fertig stellen" aus, um das Update abzuschließen. Wählen Sie nach Abschluss des Vorgangs "Schließen" aus.
Weitere Aktionen auswählen (...) >Datenbank aktualisieren.
Das Dialogfeld Datenbank mit der neuesten Migration aktualisieren wird geöffnet.
Warten Sie darauf, dass das Feld DbContext-Klassennamen aktualisiert wird und dass frühere Migrationen geladen werden. Die Aktion kann einige Sekunden dauern.
Wählen Sie "Fertig stellen" aus, um das Update abzuschließen. Wählen Sie nach Abschluss des Vorgangs "Schließen" aus.
Der Befehl „update database“ führt die Up-Methodenmigrationen aus, die in einer vom Scaffolder erstellten Migrationscodedatei nicht angewendet wurden. In diesem Fall führt der Befehl die Up Methode in der Migrations /{TIME STAMP}_{MIGRATION NAME}.cs Datei aus, die die Identity Tabellen, Einschränkungen und Indizes erstellt. Der Platzhalter {TIME STAMP} ist ein Zeitstempel, und der Platzhalter {MIGRATION NAME} ist der Migrationsname.
Wenn das Identity Schema erstellt, aber nicht auf die Datenbank angewendet wird, müssen Sie nur den Befehl ausführen, um die Datenbank zu aktualisieren:
Doppelklicken Sie im Projektmappen-Explorer auf Verbundene Dienste.
Wählen Sie im SQL Server Express LocalDB Bereich Service-AbhängigkeitenWeitere Aktionen (... ) >Update-Datenbank.
Das Dialogfeld Datenbank mit der neuesten Migration aktualisieren wird geöffnet.
Warten Sie darauf, dass das Feld DbContext-Klassennamen aktualisiert wird und dass frühere Migrationen geladen werden. Die Aktion kann einige Sekunden dauern.
Wählen Sie "Fertig stellen" aus, um das Update abzuschließen. Wählen Sie nach Abschluss des Vorgangs "Schließen" aus.
Sie können die Anwendung eines Identity-Schemas mit dem folgenden Befehl bestätigen. Die Ausgabe des Befehls enthält eine Spalte „applied“, die alle Migrationen enthält, die auf die Datenbank angewandt werden.
Führen Sie in der Visual Studio Paket-Manager Console den Befehl Get-Migration aus:
Get-Migration
Wenn mehrere Datenbankkontexte vorhanden sind, geben Sie den Kontext über den -Context-Parameter an.
Gestaltung von Authentifizierungsendpunkten
Da serverseitige BlazorAnwendungen RazorPagesIdentity-Seiten verwenden, ändert sich das Styling der Benutzeroberfläche, wenn ein Besucher zwischen IdentitySeiten und Komponenten navigiert. Sie haben zwei Optionen, um die nicht zusammenpassenden Stile anzugehen:
- Benutzerdefinierte Identity-Komponenten
- Verwenden Sie ein benutzerdefiniertes Layout mit Blazor-App-Formatvorlagen
Benutzerdefinierte Identity-Komponenten
Ein Ansatz für die Verwendung von Komponenten für Identity anstelle von Seiten besteht darin, Identity-Komponenten zu erstellen. Da SignInManager und UserManager in Razor-Komponenten nicht unterstützt werden, verwenden Sie in der Blazor-App Web-API-Endpunkte, um Benutzerkontoaktionen zu verarbeiten.
Verwenden Sie ein benutzerdefiniertes Layout mit Blazor-App-Stilen
Das Layout von Identity Pages und die Formatvorlagen können geändert werden, um Seiten zu erstellen, die Formatvorlagen verwenden, die dem Blazor-Standarddesign ähneln. Dieser Ansatz wird in der Dokumentation nicht behandelt.
Identity in serverseitige Blazor-App mit Autorisierung integrieren
Führen Sie das Identity Gerüst mit den folgenden Verfahren aus.
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie Add>New Scaffolded Item aus.
Wählen Sie im linken Bereich des Dialogfelds " Neues Gerüstelement hinzufügen " die Option Identityaus.
Wählen Sie im mittleren Bereich Identity aus, und wählen Sie dann Hinzufügen aus.
Wählen Sie im Dialogfeld "Hinzufügen Identity " die gewünschten Optionen aus:
Wenn Sie über eine vorhandene angepasste Layoutseite für Identity (_Layout.cshtml) verfügen, wählen Sie die vorhandene Seite aus, um zu vermeiden, dass Ihr Layout durch das Gerüst mit falschem Markup überschrieben wird. Wählen Sie beispielsweise eine der folgenden Optionen aus:
- 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.
Wählen Sie das Plussymbol (+) aus, und fügen Sie die Datenbankkontextklasse DbContext hinzu. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
Um einen Datenkontext zu erstellen, wählen Sie das Plussymbol (+). Übernehmen Sie den Standardwert, oder geben Sie eine Klasse an (z. B.
Contoso.Data.ApplicationDbContextfür ein Unternehmen mit dem Namen „Contoso“).Um eine neue Benutzerklasse zu erstellen, wählen Sie das Plussymbol (+) für die Benutzerklasse aus, und geben Sie die Klasse an (z
ContosoUser. B. für ein Unternehmen mit dem Namen "Contoso").
Wählen Sie "Hinzufügen" aus, um das Gerüst auszuführen.
Einige Identity-Optionen werden in Areas/Identity/IdentityHostingStartup.cs konfiguriert. Weitere Informationen finden Sie unter IHostingStartup.
Clientseitige Blazor-Apps
Clientseitige Blazor-Apps verwenden eigene Ansätze für die Identity-Benutzeroberfläche und können keine ASP.NET Core Identity-Gerüste verwenden. Serverseitige ASP.NET Core-Apps von gehosteten Blazor-Lösungen können den Anleitungen zu Razor Pages/MVC in diesem Artikel folgen und werden wie jeder andere Typ von ASP.NET Core-App konfiguriert, der Identity unterstützt.
Das Blazor-Framework enthält keine Razor-Komponentenversionen von Identity-Benutzeroberflächenseiten. Identity-Komponenten der Razor-Benutzeroberfläche können benutzerdefiniert erstellt oder aus nicht unterstützten Drittanbieterquellen abgerufen werden.
Weitere Informationen finden Sie in den Artikeln zu Blazor Sicherheit und Identity.
Vollständigen Identity UI-Quellcode erstellen
Um vollständige Kontrolle über die Identity-Benutzeroberfläche zu behalten, führen Sie das Identity-Gerüst aus und wählen Alle Dateien überschreiben aus.
Der folgende hervorgehobene Code zeigt die Änderungen, durch die die Identity-Standardbenutzeroberfläche durch Identity in einer ASP.NET Core 2.1-Web-App ersetzt wird. Dies könnten Sie z. B. durchführen, 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>();
}
Die Standard-Identity wird im folgenden Code ersetzt:
services.AddIdentity<IdentityUser, IdentityRole>()
// services.AddDefaultIdentity<IdentityUser>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
Der folgende Code legt LoginPath, LogoutPath und AccessDeniedPath fest:
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 wurden, ist möglicherweise eine Konfiguration des [StringLength]-Attributs für die Password-Eigenschaft in Identity-Gerüstseiten erforderlich.
InputModel-Password-Eigenschaften finden Sie in den folgenden Dateien:
Areas/Identity/Pages/Account/Register.cshtml.csAreas/Identity/Pages/Account/ResetPassword.cshtml.cs
Deaktivieren einer Seite
In diesem Abschnitt wird gezeigt, wie Sie die Registrierungsseite deaktivieren. Dieser Ansatz kann aber dazu verwendet werden, jede Seite zu deaktivieren.
So deaktivieren Sie die Benutzerregistrierung
Erstellen Sie ein Gerüst für 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*innen 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 Konsistenz mit den vorherigen Änderungen zu erzielen:@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>Auskommentieren oder Entfernen des Registrierungslinks in
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
Areas/Identity/Pages/Account/RegisterConfirmation-Seite.- 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 Benutzer*innen
Stellen Sie einen Mechanismus zum Hinzufügen von Benutzer*innen außerhalb der Web-App bereit. Zu den Optionen zum Hinzufügen von Benutzer*innen gehören:
- Eine dedizierte Administrator-Web-App
- Eine Konsolen-App
Der folgende Code veranschaulicht einen Ansatz zum Hinzufügen von Benutzer*innen:
- Eine Liste von Benutzer*innen wird in den Arbeitsspeicher gelesen.
- Für alle Benutzer*innen wird ein sicheres eindeutiges Kennwort generiert.
- Die Benutzer*in wird zur Identity-Datenbank hinzugefügt.
- Die Benutzer*innen werden 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>();
});
}
Der folgende Code veranschaulicht das Hinzufügen einzelner Benutzer*innen:
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 in Produktionsszenarien angewandt 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 in ASP.NET Core.
Zusätzliche Ressourcen
Änderungen am Authentifizierungscode für ASP.NET Core 2.1 oder später