Erstellen eines Gerüsts für Identity in ASP.NET Core-Projekten

Von Rick Anderson

ASP.NET Core stellt ASP.NET Core Identity als Razor-Klassenbibliothek bereit. Anwendungen, die über Identity verfügen, können das Gerüst anwenden, um den in der Razor-Klassenbibliothek (RCL) Identity 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 gleichen Code in der Razor-Klassenbibliothek Identity. 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 ohne Authentifizierung können das Gerüst anwenden, um das Paket der dem RCL-Paket Identity hinzuzufügen. Sie können Code der Klassenbibliothek Identity auswählen, der generiert werden soll.

Obwohl das Gerüst den größten Teil des erforderlichen Codes generiert, müssen Sie Ihr Projekt aktualisieren, um den Prozess abzuschließen. In diesem Dokument werden die Schritte erläutert, die zum Abschließen eines 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.

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

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

Hinweis

Einen Leitfaden zum Hinzufügen von Paketen zu .NET-Apps finden Sie in Installieren und Verwalten von Paketen unter Workflow der Nutzung von Paketen (NuGet-Dokumentation). Überprüfen Sie unter NuGet.org, ob die richtige Paketversion verwendet wird.


Führen Sie das Identity-Gerüst aus:

  • Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie dann >Hinzufügen>Neues Gerüstelement aus.
  • Wählen Sie im linken Bereich des Dialogfelds Neues Gerüstelement hinzufügen die Option Identity aus. Wählen Sie im mittleren Bereich die Option Identity aus. Wählen Sie die Schaltfläche Hinzufügen aus.
  • Wählen Sie im Dialogfeld Identity hinzufügen die gewünschten Optionen aus.
    • Wenn Sie über eine vorhandene, angepasste Layoutseite für Identity (_Layout.cshtml) verfügen, wählen Sie Ihre vorhandene Layoutseite aus, um zu vermeiden, dass Ihr Layout mit falschem Markup vom Gerüst überschrieben wird. Wählen Sie z. B. 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- oder Blazor Server-Projekte mit vorhandener MVC-Infrastruktur
    • Für den Datenkontext (DbContext-Klasse):
      • Wählen Sie Ihre Datenkontextklasse aus. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
      • Um einen Datenkontext zu erstellen und möglicherweise eine neue User-Klasse für Identity zu erstellen, wählen Sie die Schaltfläche + aus. Übernehmen Sie den Standardwert, oder geben Sie eine Klasse an (z. B. Contoso.Data.ApplicationDbContext für ein Unternehmen mit dem Namen „Contoso“). Um eine neue Benutzerklasse zu erstellen, wählen Sie die Schaltfläche +für die User-Klasse aus, und geben Sie die Klasse an (z. B. ContosoUser für ein Unternehmen mit dem Namen „Contoso“).
    • Wählen Sie die Schaltfläche Hinzufügen aus, um das Gerüst auszuführen.

Migrationen, UseAuthentication und Layout

Der generierte Identity-Datenbankcode erfordert Entity Framework Core-Migrationen. Wenn keine Migration zum Erstellen des Identity-Schemas erstellt und auf die Datenbank angewandt wurde, erstellen Sie eine Migration, und aktualisieren Sie die Datenbank. Führen Sie beispielsweise die folgenden Befehle aus:

In der Paket-Manager-Konsole von Visual Studio:

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

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

Wenn das Identity-Schema bereits erstellt, aber noch nicht auf die Datenbank angewandt wurde, muss nur der Befehl zum Aktualisieren der Datenbank ausgeführt werden:

Führen Sie in der Paket-Manager-Konsole von Visual Studio Update-Database aus:

Update-Database

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 Paket-Manager-Konsole von Visual Studio 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">
            &copy; 2021 - WebRPnoAuth2Auth - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

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

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

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

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

Hinweis

Einen Leitfaden zum Hinzufügen von Paketen zu .NET-Apps finden Sie in Installieren und Verwalten von Paketen unter Workflow der Nutzung von Paketen (NuGet-Dokumentation). Überprüfen Sie unter NuGet.org, ob die richtige Paketversion verwendet wird.


Führen Sie das Identity-Gerüst aus:

  • Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie dann >Hinzufügen>Neues Gerüstelement aus.
  • Wählen Sie im linken Bereich des Dialogfelds Neues Gerüstelement hinzufügen die Option Identity aus. Wählen Sie im mittleren Bereich die Option Identity aus. Wählen Sie die Schaltfläche Hinzufügen aus.
  • Wählen Sie im Dialogfeld Identity hinzufügen die gewünschten Optionen aus.
    • Wenn Sie über eine vorhandene, angepasste Layoutseite für Identity (_Layout.cshtml) verfügen, wählen Sie Ihre vorhandene Layoutseite aus, um zu vermeiden, dass Ihr Layout mit falschem Markup vom Gerüst überschrieben wird. Wählen Sie z. B. 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- oder Blazor Server-Projekte mit vorhandener MVC-Infrastruktur
    • Für den Datenkontext (DbContext-Klasse):
      • Wählen Sie Ihre Datenkontextklasse aus. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
      • Um einen Datenkontext zu erstellen und möglicherweise eine neue User-Klasse für Identity zu erstellen, wählen Sie die Schaltfläche + aus. Übernehmen Sie den Standardwert, oder geben Sie eine Klasse an (z. B. Contoso.Data.ApplicationDbContext für ein Unternehmen mit dem Namen „Contoso“). Um eine neue Benutzerklasse zu erstellen, wählen Sie die Schaltfläche +für die User-Klasse aus, und geben Sie die Klasse an (z. B. ContosoUser für ein Unternehmen mit dem Namen „Contoso“).
    • Wählen Sie die Schaltfläche 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 das NuGet-Paket Microsoft.VisualStudio.Web.CodeGeneration.Design.

Hinweis

Einen Leitfaden zum Hinzufügen von Paketen zu .NET-Apps finden Sie in Installieren und Verwalten von Paketen unter Workflow der Nutzung von Paketen (NuGet-Dokumentation). Überprüfen Sie unter NuGet.org, ob die richtige Paketversion verwendet wird.


Führen Sie das Identity-Gerüst aus:

  • Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie dann >Hinzufügen>Neues Gerüstelement aus.
  • Wählen Sie im linken Bereich des Dialogfelds Neues Gerüstelement hinzufügen die Option Identity aus. Wählen Sie im mittleren Bereich die Option Identity aus. Wählen Sie die Schaltfläche Hinzufügen aus.
  • Wählen Sie im Dialogfeld Identity hinzufügen die gewünschten Optionen aus.
    • Wenn Sie über eine vorhandene, angepasste Layoutseite für Identity (_Layout.cshtml) verfügen, wählen Sie Ihre vorhandene Layoutseite aus, um zu vermeiden, dass Ihr Layout mit falschem Markup vom Gerüst überschrieben wird. Wählen Sie z. B. 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- oder Blazor Server-Projekte mit vorhandener MVC-Infrastruktur
    • Für den Datenkontext (DbContext-Klasse):
      • Wählen Sie Ihre Datenkontextklasse aus. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
      • Um einen Datenkontext zu erstellen und möglicherweise eine neue User-Klasse für Identity zu erstellen, wählen Sie die Schaltfläche + aus. Übernehmen Sie den Standardwert, oder geben Sie eine Klasse an (z. B. Contoso.Data.ApplicationDbContext für ein Unternehmen mit dem Namen „Contoso“). Um eine neue Benutzerklasse zu erstellen, wählen Sie die Schaltfläche +für die User-Klasse aus, und geben Sie die Klasse an (z. B. ContosoUser für ein Unternehmen mit dem Namen „Contoso“).
    • Wählen Sie die Schaltfläche Hinzufügen aus, um das Gerüst auszuführen.

Optional: Fügen Sie der Datei Views/Shared/_Layout.cshtml 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">
            &copy; 2021 - WebRPnoAuth2Auth - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

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

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

Der generierte Identity-Datenbankcode erfordert Entity Framework Core-Migrationen. Wenn keine Migration zum Erstellen des Identity-Schemas erstellt und auf die Datenbank angewandt wurde, erstellen Sie eine Migration, und aktualisieren Sie die Datenbank. Führen Sie beispielsweise die folgenden Befehle aus:

In der Paket-Manager-Konsole von Visual Studio:

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

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

Wenn das Identity-Schema bereits erstellt, aber noch nicht auf die Datenbank angewandt wurde, muss nur der Befehl zum Aktualisieren der Datenbank ausgeführt werden:

Führen Sie in der Paket-Manager-Konsole von Visual Studio Update-Database aus:

Update-Database

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 Paket-Manager-Konsole von Visual Studio 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 das NuGet-Paket Microsoft.VisualStudio.Web.CodeGeneration.Design.

Hinweis

Einen Leitfaden zum Hinzufügen von Paketen zu .NET-Apps finden Sie in Installieren und Verwalten von Paketen unter Workflow der Nutzung von Paketen (NuGet-Dokumentation). Überprüfen Sie unter NuGet.org, ob die richtige Paketversion verwendet wird.


Führen Sie das Identity-Gerüst aus:

  • Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie dann >Hinzufügen>Neues Gerüstelement aus.
  • Wählen Sie im linken Bereich des Dialogfelds Neues Gerüstelement hinzufügen die Option Identity aus. Wählen Sie im mittleren Bereich die Option Identity aus. Wählen Sie die Schaltfläche Hinzufügen aus.
  • Wählen Sie im Dialogfeld Identity hinzufügen die gewünschten Optionen aus.
    • Wenn Sie über eine vorhandene, angepasste Layoutseite für Identity (_Layout.cshtml) verfügen, wählen Sie Ihre vorhandene Layoutseite aus, um zu vermeiden, dass Ihr Layout mit falschem Markup vom Gerüst überschrieben wird. Wählen Sie z. B. 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- oder Blazor Server-Projekte mit vorhandener MVC-Infrastruktur
    • Für den Datenkontext (DbContext-Klasse):
      • Wählen Sie Ihre Datenkontextklasse aus. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
      • Um einen Datenkontext zu erstellen und möglicherweise eine neue User-Klasse für Identity zu erstellen, wählen Sie die Schaltfläche + aus. Übernehmen Sie den Standardwert, oder geben Sie eine Klasse an (z. B. Contoso.Data.ApplicationDbContext für ein Unternehmen mit dem Namen „Contoso“). Um eine neue Benutzerklasse zu erstellen, wählen Sie die Schaltfläche +für die User-Klasse aus, und geben Sie die Klasse an (z. B. ContosoUser für ein Unternehmen mit dem Namen „Contoso“).
    • Wählen Sie die Schaltfläche Hinzufügen aus, um das Gerüst auszuführen.

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.

Bei serverseitigen ASP.NET Core-Apps können Sie die Leitfäden zu Razor Pages/MVC in diesem Artikel befolgen. Sie werden wie jeder andere Typ von ASP.NET Core-Apps konfiguriert, die Identity unterstützen. Das Blazor Framework verwendet Razor Komponentenversionen (.razor) von UI-Seiten (Identity) beim Erstellen eines .cshtml Gerüsts Identity in einer Blazor Web App.

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

Erstellen einer vollständigen Quelle für die Identity-Benutzeroberfläche

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. InputModelPassword-Eigenschaften finden Sie in den folgenden Dateien:

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

Deaktivieren einer Seite

In diesem Abschnitt wird gezeigt, wie Sie die 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 Seite Areas/Identity/Pages/Account/RegisterConfirmation.

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

Verwenden einer anderen App zum Hinzufügen von 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.
  • Der Benutzer*innen werden der 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 bereit. Anwendungen, die über Identity verfügen, können das Gerüst anwenden, um den in der Razor-Klassenbibliothek (RCL) Identity 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 gleichen Code in der Razor-Klassenbibliothek Identity. 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 ohne Authentifizierung können das Gerüst anwenden, um das Paket der dem RCL-Paket Identity hinzuzufügen. Sie können Code der Klassenbibliothek Identity auswählen, der generiert werden soll.

Obwohl das Gerüst den größten Teil des erforderlichen Codes generiert, müssen Sie Ihr Projekt aktualisieren, um den Prozess abzuschließen. In diesem Dokument werden die Schritte erläutert, die zum Abschließen eines 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.

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

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

Hinweis

Einen Leitfaden zum Hinzufügen von Paketen zu .NET-Apps finden Sie in Installieren und Verwalten von Paketen unter Workflow der Nutzung von Paketen (NuGet-Dokumentation). Überprüfen Sie unter NuGet.org, ob die richtige Paketversion verwendet wird.


Führen Sie das Identity-Gerüst aus:

  • Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie dann >Hinzufügen>Neues Gerüstelement aus.
  • Wählen Sie im linken Bereich des Dialogfelds Neues Gerüstelement hinzufügen die Option Identity aus. Wählen Sie im mittleren Bereich die Option Identity aus. Wählen Sie die Schaltfläche Hinzufügen aus.
  • Wählen Sie im Dialogfeld Identity hinzufügen die gewünschten Optionen aus.
    • Wenn Sie über eine vorhandene, angepasste Layoutseite für Identity (_Layout.cshtml) verfügen, wählen Sie Ihre vorhandene Layoutseite aus, um zu vermeiden, dass Ihr Layout mit falschem Markup vom Gerüst überschrieben wird. Wählen Sie z. B. 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- oder Blazor Server-Projekte mit vorhandener MVC-Infrastruktur
    • Für den Datenkontext (DbContext-Klasse):
      • Wählen Sie Ihre Datenkontextklasse aus. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
      • Um einen Datenkontext zu erstellen und möglicherweise eine neue User-Klasse für Identity zu erstellen, wählen Sie die Schaltfläche + aus. Übernehmen Sie den Standardwert, oder geben Sie eine Klasse an (z. B. Contoso.Data.ApplicationDbContext für ein Unternehmen mit dem Namen „Contoso“). Um eine neue Benutzerklasse zu erstellen, wählen Sie die Schaltfläche +für die User-Klasse aus, und geben Sie die Klasse an (z. B. ContosoUser für ein Unternehmen mit dem Namen „Contoso“).
    • Wählen Sie die Schaltfläche Hinzufügen aus, um das Gerüst auszuführen.

Migrationen, UseAuthentication und Layout

Der generierte Identity-Datenbankcode erfordert Entity Framework Core-Migrationen. Wenn keine Migration zum Erstellen des Identity-Schemas erstellt und auf die Datenbank angewandt wurde, erstellen Sie eine Migration, und aktualisieren Sie die Datenbank. Führen Sie beispielsweise die folgenden Befehle aus:

In der Paket-Manager-Konsole von Visual Studio:

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

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

Wenn das Identity-Schema bereits erstellt, aber noch nicht auf die Datenbank angewandt wurde, muss nur der Befehl zum Aktualisieren der Datenbank ausgeführt werden:

Führen Sie in der Paket-Manager-Konsole von Visual Studio Update-Database aus:

Update-Database

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 Paket-Manager-Konsole von Visual Studio 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">
            &copy; 2021 - WebRPnoAuth2Auth - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

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

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

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

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

Hinweis

Einen Leitfaden zum Hinzufügen von Paketen zu .NET-Apps finden Sie in Installieren und Verwalten von Paketen unter Workflow der Nutzung von Paketen (NuGet-Dokumentation). Überprüfen Sie unter NuGet.org, ob die richtige Paketversion verwendet wird.


Führen Sie das Identity-Gerüst aus:

  • Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie dann >Hinzufügen>Neues Gerüstelement aus.
  • Wählen Sie im linken Bereich des Dialogfelds Neues Gerüstelement hinzufügen die Option Identity aus. Wählen Sie im mittleren Bereich die Option Identity aus. Wählen Sie die Schaltfläche Hinzufügen aus.
  • Wählen Sie im Dialogfeld Identity hinzufügen die gewünschten Optionen aus.
    • Wenn Sie über eine vorhandene, angepasste Layoutseite für Identity (_Layout.cshtml) verfügen, wählen Sie Ihre vorhandene Layoutseite aus, um zu vermeiden, dass Ihr Layout mit falschem Markup vom Gerüst überschrieben wird. Wählen Sie z. B. 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- oder Blazor Server-Projekte mit vorhandener MVC-Infrastruktur
    • Für den Datenkontext (DbContext-Klasse):
      • Wählen Sie Ihre Datenkontextklasse aus. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
      • Um einen Datenkontext zu erstellen und möglicherweise eine neue User-Klasse für Identity zu erstellen, wählen Sie die Schaltfläche + aus. Übernehmen Sie den Standardwert, oder geben Sie eine Klasse an (z. B. Contoso.Data.ApplicationDbContext für ein Unternehmen mit dem Namen „Contoso“). Um eine neue Benutzerklasse zu erstellen, wählen Sie die Schaltfläche +für die User-Klasse aus, und geben Sie die Klasse an (z. B. ContosoUser für ein Unternehmen mit dem Namen „Contoso“).
    • Wählen Sie die Schaltfläche 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 das NuGet-Paket Microsoft.VisualStudio.Web.CodeGeneration.Design.

Hinweis

Einen Leitfaden zum Hinzufügen von Paketen zu .NET-Apps finden Sie in Installieren und Verwalten von Paketen unter Workflow der Nutzung von Paketen (NuGet-Dokumentation). Überprüfen Sie unter NuGet.org, ob die richtige Paketversion verwendet wird.


Führen Sie das Identity-Gerüst aus:

  • Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie dann >Hinzufügen>Neues Gerüstelement aus.
  • Wählen Sie im linken Bereich des Dialogfelds Neues Gerüstelement hinzufügen die Option Identity aus. Wählen Sie im mittleren Bereich die Option Identity aus. Wählen Sie die Schaltfläche Hinzufügen aus.
  • Wählen Sie im Dialogfeld Identity hinzufügen die gewünschten Optionen aus.
    • Wenn Sie über eine vorhandene, angepasste Layoutseite für Identity (_Layout.cshtml) verfügen, wählen Sie Ihre vorhandene Layoutseite aus, um zu vermeiden, dass Ihr Layout mit falschem Markup vom Gerüst überschrieben wird. Wählen Sie z. B. 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- oder Blazor Server-Projekte mit vorhandener MVC-Infrastruktur
    • Für den Datenkontext (DbContext-Klasse):
      • Wählen Sie Ihre Datenkontextklasse aus. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
      • Um einen Datenkontext zu erstellen und möglicherweise eine neue User-Klasse für Identity zu erstellen, wählen Sie die Schaltfläche + aus. Übernehmen Sie den Standardwert, oder geben Sie eine Klasse an (z. B. Contoso.Data.ApplicationDbContext für ein Unternehmen mit dem Namen „Contoso“). Um eine neue Benutzerklasse zu erstellen, wählen Sie die Schaltfläche +für die User-Klasse aus, und geben Sie die Klasse an (z. B. ContosoUser für ein Unternehmen mit dem Namen „Contoso“).
    • Wählen Sie die Schaltfläche Hinzufügen aus, um das Gerüst auszuführen.

Optional: Fügen Sie der Datei Views/Shared/_Layout.cshtml 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">
            &copy; 2021 - WebRPnoAuth2Auth - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

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

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

Der generierte Identity-Datenbankcode erfordert Entity Framework Core-Migrationen. Wenn keine Migration zum Erstellen des Identity-Schemas erstellt und auf die Datenbank angewandt wurde, erstellen Sie eine Migration, und aktualisieren Sie die Datenbank. Führen Sie beispielsweise die folgenden Befehle aus:

In der Paket-Manager-Konsole von Visual Studio:

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

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

Wenn das Identity-Schema bereits erstellt, aber noch nicht auf die Datenbank angewandt wurde, muss nur der Befehl zum Aktualisieren der Datenbank ausgeführt werden:

Führen Sie in der Paket-Manager-Konsole von Visual Studio Update-Database aus:

Update-Database

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 Paket-Manager-Konsole von Visual Studio 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 das NuGet-Paket Microsoft.VisualStudio.Web.CodeGeneration.Design.

Hinweis

Einen Leitfaden zum Hinzufügen von Paketen zu .NET-Apps finden Sie in Installieren und Verwalten von Paketen unter Workflow der Nutzung von Paketen (NuGet-Dokumentation). Überprüfen Sie unter NuGet.org, ob die richtige Paketversion verwendet wird.


Führen Sie das Identity-Gerüst aus:

  • Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie dann >Hinzufügen>Neues Gerüstelement aus.
  • Wählen Sie im linken Bereich des Dialogfelds Neues Gerüstelement hinzufügen die Option Identity aus. Wählen Sie im mittleren Bereich die Option Identity aus. Wählen Sie die Schaltfläche Hinzufügen aus.
  • Wählen Sie im Dialogfeld Identity hinzufügen die gewünschten Optionen aus.
    • Wenn Sie über eine vorhandene, angepasste Layoutseite für Identity (_Layout.cshtml) verfügen, wählen Sie Ihre vorhandene Layoutseite aus, um zu vermeiden, dass Ihr Layout mit falschem Markup vom Gerüst überschrieben wird. Wählen Sie z. B. 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- oder Blazor Server-Projekte mit vorhandener MVC-Infrastruktur
    • Für den Datenkontext (DbContext-Klasse):
      • Wählen Sie Ihre Datenkontextklasse aus. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
      • Um einen Datenkontext zu erstellen und möglicherweise eine neue User-Klasse für Identity zu erstellen, wählen Sie die Schaltfläche + aus. Übernehmen Sie den Standardwert, oder geben Sie eine Klasse an (z. B. Contoso.Data.ApplicationDbContext für ein Unternehmen mit dem Namen „Contoso“). Um eine neue Benutzerklasse zu erstellen, wählen Sie die Schaltfläche +für die User-Klasse aus, und geben Sie die Klasse an (z. B. ContosoUser für ein Unternehmen mit dem Namen „Contoso“).
    • Wählen Sie die Schaltfläche Hinzufügen aus, um das Gerüst auszuführen.

Gerüstbau für Identity in einer serverseitigen Blazor-App mit Autorisierung

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

Hinweis

Einen Leitfaden zum Hinzufügen von Paketen zu .NET-Apps finden Sie in Installieren und Verwalten von Paketen unter Workflow der Nutzung von Paketen (NuGet-Dokumentation). Überprüfen Sie unter NuGet.org, ob die richtige Paketversion verwendet wird.


Führen Sie das Identity-Gerüst aus:

  • Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie dann >Hinzufügen>Neues Gerüstelement aus.
  • Wählen Sie im linken Bereich des Dialogfelds Neues Gerüstelement hinzufügen die Option Identity aus. Wählen Sie im mittleren Bereich die Option Identity aus. Wählen Sie die Schaltfläche Hinzufügen aus.
  • Wählen Sie im Dialogfeld Identity hinzufügen die gewünschten Optionen aus.
    • Wenn Sie über eine vorhandene, angepasste Layoutseite für Identity (_Layout.cshtml) verfügen, wählen Sie Ihre vorhandene Layoutseite aus, um zu vermeiden, dass Ihr Layout mit falschem Markup vom Gerüst überschrieben wird. Wählen Sie z. B. 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- oder Blazor Server-Projekte mit vorhandener MVC-Infrastruktur
    • Für den Datenkontext (DbContext-Klasse):
      • Wählen Sie Ihre Datenkontextklasse aus. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
      • Um einen Datenkontext zu erstellen und möglicherweise eine neue User-Klasse für Identity zu erstellen, wählen Sie die Schaltfläche + aus. Übernehmen Sie den Standardwert, oder geben Sie eine Klasse an (z. B. Contoso.Data.ApplicationDbContext für ein Unternehmen mit dem Namen „Contoso“). Um eine neue Benutzerklasse zu erstellen, wählen Sie die Schaltfläche +für die User-Klasse aus, und geben Sie die Klasse an (z. B. ContosoUser für ein Unternehmen mit dem Namen „Contoso“).
    • Wählen Sie die Schaltfläche Hinzufügen aus, um das Gerüst auszuführen.

Migrationen

Der generierte Identity-Datenbankcode erfordert Entity Framework Core-Migrationen. Wenn keine Migration zum Erstellen des Identity-Schemas erstellt und auf die Datenbank angewandt wurde, erstellen Sie eine Migration, und aktualisieren Sie die Datenbank. Führen Sie beispielsweise die folgenden Befehle aus:

In der Paket-Manager-Konsole von Visual Studio:

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

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

Wenn das Identity-Schema bereits erstellt, aber noch nicht auf die Datenbank angewandt wurde, muss nur der Befehl zum Aktualisieren der Datenbank ausgeführt werden:

Führen Sie in der Paket-Manager-Konsole von Visual Studio Update-Database aus:

Update-Database

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 Paket-Manager-Konsole von Visual Studio Get-Migration aus:

Get-Migration

Wenn mehrere Datenbankkontexte vorhanden sind, geben Sie den Kontext über den -Context-Parameter an.

Formatieren 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 unterschiedlichen Stile zu behandeln:

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, welche die Benutzerverwaltung mit ASP.NET Core Identity umsetzen, sollten für eine Identity Benutzeroberfläche Razor Seiten anstelle von Razor Komponenten verwenden, z. B. Benutzerregistrierung, Anmelden, Abmelden und andere Benutzerverwaltungsaufgaben.

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. Weitere Informationen finden Sie in den folgenden Erläuterungen. 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:

Für zusätzliche Unterstützung beim Erstellen benutzerdefinierter IdentityRazor-Komponenten oder beim Suchen nach Razor-Komponenten von Drittanbietern werden die folgenden Ressourcen empfohlen:

Verwenden eines benutzerdefinierten Layouts mit Blazor-App-Formatvorlagen

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. Bei serverseitigen ASP.NET Core-Apps gehosteter Blazor-Lösungen können Sie die Leitfäden zu Razor Pages/MVC in diesem Artikel befolgen. Sie werden wie jeder andere Typ von ASP.NET Core-Apps konfiguriert, die Identity unterstützen.

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

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

Erstellen einer vollständigen Quelle für die Identity-Benutzeroberfläche

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. InputModelPassword-Eigenschaften finden Sie in den folgenden Dateien:

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

Deaktivieren einer Seite

In diesem Abschnitt wird gezeigt, wie Sie die 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 Seite Areas/Identity/Pages/Account/RegisterConfirmation.

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

Verwenden einer anderen App zum Hinzufügen von 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.
  • Der Benutzer*innen werden der 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 bereit. Anwendungen, die über Identity verfügen, können das Gerüst anwenden, um den in der Razor-Klassenbibliothek (RCL) Identity 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 gleichen Code in der Razor-Klassenbibliothek Identity. 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 ohne Authentifizierung können das Gerüst anwenden, um das Paket der dem RCL-Paket Identity hinzuzufügen. Sie können Code der Klassenbibliothek Identity auswählen, der generiert werden soll.

Obwohl das Gerüst den größten Teil des erforderlichen Codes generiert, müssen Sie Ihr Projekt aktualisieren, um den Prozess abzuschließen. In diesem Dokument werden die Schritte erläutert, die zum Abschließen eines 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.

Beim Erstellen eines Gerüsts für Identity mit einem neuen Datenkontext in einem Projekt mit vorhandenen Einzelkonten:

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

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 obigen Code wird Code auskommentiert, der in Areas/Identity/IdentityHostingStartup.cs dupliziert wurde.

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

  • Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie dann >Hinzufügen>Neues Gerüstelement aus.
  • Wählen Sie im linken Bereich des Dialogfelds Neues Gerüstelement hinzufügen die Option Identity aus. Wählen Sie im mittleren Bereich die Option Identity aus. Wählen Sie die Schaltfläche Hinzufügen aus.
  • Wählen Sie im Dialogfeld Identity hinzufügen die gewünschten Optionen aus.
    • Wenn Sie über eine vorhandene, angepasste Layoutseite für Identity (_Layout.cshtml) verfügen, wählen Sie Ihre vorhandene Layoutseite aus, um zu vermeiden, dass Ihr Layout mit falschem Markup vom Gerüst überschrieben wird. Wählen Sie z. B. 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- oder Blazor Server-Projekte mit vorhandener MVC-Infrastruktur
    • Für den Datenkontext (DbContext-Klasse):
      • Wählen Sie Ihre Datenkontextklasse aus. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
      • Um einen Datenkontext zu erstellen und möglicherweise eine neue User-Klasse für Identity zu erstellen, wählen Sie die Schaltfläche + aus. Übernehmen Sie den Standardwert, oder geben Sie eine Klasse an (z. B. Contoso.Data.ApplicationDbContext für ein Unternehmen mit dem Namen „Contoso“). Um eine neue Benutzerklasse zu erstellen, wählen Sie die Schaltfläche +für die User-Klasse aus, und geben Sie die Klasse an (z. B. ContosoUser für ein Unternehmen mit dem Namen „Contoso“).
    • Wählen Sie die Schaltfläche 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 keine Migration zum Erstellen des Identity-Schemas erstellt und auf die Datenbank angewandt wurde, erstellen Sie eine Migration, und aktualisieren Sie die Datenbank. Führen Sie beispielsweise die folgenden Befehle aus:

In der Paket-Manager-Konsole von Visual Studio:

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

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

Wenn das Identity-Schema bereits erstellt, aber noch nicht auf die Datenbank angewandt wurde, muss nur der Befehl zum Aktualisieren der Datenbank ausgeführt werden:

Führen Sie in der Paket-Manager-Konsole von Visual Studio Update-Database aus:

Update-Database

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 Paket-Manager-Konsole von Visual Studio Get-Migration aus:

Get-Migration

Wenn mehrere Datenbankkontexte vorhanden sind, geben Sie den Kontext über den -Context-Parameter an.

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

Führen Sie das Identity-Gerüst aus:

  • Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie dann >Hinzufügen>Neues Gerüstelement aus.
  • Wählen Sie im linken Bereich des Dialogfelds Neues Gerüstelement hinzufügen die Option Identity aus. Wählen Sie im mittleren Bereich die Option Identity aus. Wählen Sie die Schaltfläche Hinzufügen aus.
  • Wählen Sie im Dialogfeld Identity hinzufügen die gewünschten Optionen aus.
    • Wenn Sie über eine vorhandene, angepasste Layoutseite für Identity (_Layout.cshtml) verfügen, wählen Sie Ihre vorhandene Layoutseite aus, um zu vermeiden, dass Ihr Layout mit falschem Markup vom Gerüst überschrieben wird. Wählen Sie z. B. 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- oder Blazor Server-Projekte mit vorhandener MVC-Infrastruktur
    • Für den Datenkontext (DbContext-Klasse):
      • Wählen Sie Ihre Datenkontextklasse aus. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
      • Um einen Datenkontext zu erstellen und möglicherweise eine neue User-Klasse für Identity zu erstellen, wählen Sie die Schaltfläche + aus. Übernehmen Sie den Standardwert, oder geben Sie eine Klasse an (z. B. Contoso.Data.ApplicationDbContext für ein Unternehmen mit dem Namen „Contoso“). Um eine neue Benutzerklasse zu erstellen, wählen Sie die Schaltfläche +für die User-Klasse aus, und geben Sie die Klasse an (z. B. ContosoUser für ein Unternehmen mit dem Namen „Contoso“).
    • Wählen Sie die Schaltfläche 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 keine Migration zum Erstellen des Identity-Schemas erstellt und auf die Datenbank angewandt wurde, erstellen Sie eine Migration, und aktualisieren Sie die Datenbank. Führen Sie beispielsweise die folgenden Befehle aus:

In der Paket-Manager-Konsole von Visual Studio:

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

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

Wenn das Identity-Schema bereits erstellt, aber noch nicht auf die Datenbank angewandt wurde, muss nur der Befehl zum Aktualisieren der Datenbank ausgeführt werden:

Führen Sie in der Paket-Manager-Konsole von Visual Studio Update-Database aus:

Update-Database

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 Paket-Manager-Konsole von Visual Studio 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">
            &copy; 2019 - WebRP - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

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

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

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

Führen Sie das Identity-Gerüst aus:

  • Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie dann >Hinzufügen>Neues Gerüstelement aus.
  • Wählen Sie im linken Bereich des Dialogfelds Neues Gerüstelement hinzufügen die Option Identity aus. Wählen Sie im mittleren Bereich die Option Identity aus. Wählen Sie die Schaltfläche Hinzufügen aus.
  • Wählen Sie im Dialogfeld Identity hinzufügen die gewünschten Optionen aus.
    • Wenn Sie über eine vorhandene, angepasste Layoutseite für Identity (_Layout.cshtml) verfügen, wählen Sie Ihre vorhandene Layoutseite aus, um zu vermeiden, dass Ihr Layout mit falschem Markup vom Gerüst überschrieben wird. Wählen Sie z. B. 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- oder Blazor Server-Projekte mit vorhandener MVC-Infrastruktur
    • Für den Datenkontext (DbContext-Klasse):
      • Wählen Sie Ihre Datenkontextklasse aus. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
      • Um einen Datenkontext zu erstellen und möglicherweise eine neue User-Klasse für Identity zu erstellen, wählen Sie die Schaltfläche + aus. Übernehmen Sie den Standardwert, oder geben Sie eine Klasse an (z. B. Contoso.Data.ApplicationDbContext für ein Unternehmen mit dem Namen „Contoso“). Um eine neue Benutzerklasse zu erstellen, wählen Sie die Schaltfläche +für die User-Klasse aus, und geben Sie die Klasse an (z. B. ContosoUser für ein Unternehmen mit dem Namen „Contoso“).
    • Wählen Sie die Schaltfläche 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 aus:

  • Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie dann >Hinzufügen>Neues Gerüstelement aus.
  • Wählen Sie im linken Bereich des Dialogfelds Neues Gerüstelement hinzufügen die Option Identity aus. Wählen Sie im mittleren Bereich die Option Identity aus. Wählen Sie die Schaltfläche Hinzufügen aus.
  • Wählen Sie im Dialogfeld Identity hinzufügen die gewünschten Optionen aus.
    • Wenn Sie über eine vorhandene, angepasste Layoutseite für Identity (_Layout.cshtml) verfügen, wählen Sie Ihre vorhandene Layoutseite aus, um zu vermeiden, dass Ihr Layout mit falschem Markup vom Gerüst überschrieben wird. Wählen Sie z. B. 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- oder Blazor Server-Projekte mit vorhandener MVC-Infrastruktur
    • Für den Datenkontext (DbContext-Klasse):
      • Wählen Sie Ihre Datenkontextklasse aus. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
      • Um einen Datenkontext zu erstellen und möglicherweise eine neue User-Klasse für Identity zu erstellen, wählen Sie die Schaltfläche + aus. Übernehmen Sie den Standardwert, oder geben Sie eine Klasse an (z. B. Contoso.Data.ApplicationDbContext für ein Unternehmen mit dem Namen „Contoso“). Um eine neue Benutzerklasse zu erstellen, wählen Sie die Schaltfläche +für die User-Klasse aus, und geben Sie die Klasse an (z. B. ContosoUser für ein Unternehmen mit dem Namen „Contoso“).
    • Wählen Sie die Schaltfläche Hinzufügen aus, um das Gerüst auszuführen.

Optional: Fügen Sie der Datei Views/Shared/_Layout.cshtml 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">
            &copy; 2019 - WebRP - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

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

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

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

Der generierte Identity-Datenbankcode erfordert Entity Framework Core-Migrationen. Wenn keine Migration zum Erstellen des Identity-Schemas erstellt und auf die Datenbank angewandt wurde, erstellen Sie eine Migration, und aktualisieren Sie die Datenbank. Führen Sie beispielsweise die folgenden Befehle aus:

In der Paket-Manager-Konsole von Visual Studio:

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

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

Wenn das Identity-Schema bereits erstellt, aber noch nicht auf die Datenbank angewandt wurde, muss nur der Befehl zum Aktualisieren der Datenbank ausgeführt werden:

Führen Sie in der Paket-Manager-Konsole von Visual Studio Update-Database aus:

Update-Database

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 Paket-Manager-Konsole von Visual Studio 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 aus:

  • Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie dann >Hinzufügen>Neues Gerüstelement aus.
  • Wählen Sie im linken Bereich des Dialogfelds Neues Gerüstelement hinzufügen die Option Identity aus. Wählen Sie im mittleren Bereich die Option Identity aus. Wählen Sie die Schaltfläche Hinzufügen aus.
  • Wählen Sie im Dialogfeld Identity hinzufügen die gewünschten Optionen aus.
    • Wenn Sie über eine vorhandene, angepasste Layoutseite für Identity (_Layout.cshtml) verfügen, wählen Sie Ihre vorhandene Layoutseite aus, um zu vermeiden, dass Ihr Layout mit falschem Markup vom Gerüst überschrieben wird. Wählen Sie z. B. 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- oder Blazor Server-Projekte mit vorhandener MVC-Infrastruktur
    • Für den Datenkontext (DbContext-Klasse):
      • Wählen Sie Ihre Datenkontextklasse aus. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
      • Um einen Datenkontext zu erstellen und möglicherweise eine neue User-Klasse für Identity zu erstellen, wählen Sie die Schaltfläche + aus. Übernehmen Sie den Standardwert, oder geben Sie eine Klasse an (z. B. Contoso.Data.ApplicationDbContext für ein Unternehmen mit dem Namen „Contoso“). Um eine neue Benutzerklasse zu erstellen, wählen Sie die Schaltfläche +für die User-Klasse aus, und geben Sie die Klasse an (z. B. ContosoUser für ein Unternehmen mit dem Namen „Contoso“).
    • Wählen Sie die Schaltfläche Hinzufügen aus, um das Gerüst auszuführen.

Erstellen eines Gerüsts von Identity in eine Blazor-App ohne vorhandene Autorisierung

Führen Sie das Identity-Gerüst aus:

  • Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie dann >Hinzufügen>Neues Gerüstelement aus.
  • Wählen Sie im linken Bereich des Dialogfelds Neues Gerüstelement hinzufügen die Option Identity aus. Wählen Sie im mittleren Bereich die Option Identity aus. Wählen Sie die Schaltfläche Hinzufügen aus.
  • Wählen Sie im Dialogfeld Identity hinzufügen die gewünschten Optionen aus.
    • Wenn Sie über eine vorhandene, angepasste Layoutseite für Identity (_Layout.cshtml) verfügen, wählen Sie Ihre vorhandene Layoutseite aus, um zu vermeiden, dass Ihr Layout mit falschem Markup vom Gerüst überschrieben wird. Wählen Sie z. B. 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- oder Blazor Server-Projekte mit vorhandener MVC-Infrastruktur
    • Für den Datenkontext (DbContext-Klasse):
      • Wählen Sie Ihre Datenkontextklasse aus. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
      • Um einen Datenkontext zu erstellen und möglicherweise eine neue User-Klasse für Identity zu erstellen, wählen Sie die Schaltfläche + aus. Übernehmen Sie den Standardwert, oder geben Sie eine Klasse an (z. B. Contoso.Data.ApplicationDbContext für ein Unternehmen mit dem Namen „Contoso“). Um eine neue Benutzerklasse zu erstellen, wählen Sie die Schaltfläche +für die User-Klasse aus, und geben Sie die Klasse an (z. B. ContosoUser für ein Unternehmen mit dem Namen „Contoso“).
    • Wählen Sie die Schaltfläche 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 keine Migration zum Erstellen des Identity-Schemas erstellt und auf die Datenbank angewandt wurde, erstellen Sie eine Migration, und aktualisieren Sie die Datenbank. Führen Sie beispielsweise die folgenden Befehle aus:

In der Paket-Manager-Konsole von Visual Studio:

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

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

Wenn das Identity-Schema bereits erstellt, aber noch nicht auf die Datenbank angewandt wurde, muss nur der Befehl zum Aktualisieren der Datenbank ausgeführt werden:

Führen Sie in der Paket-Manager-Konsole von Visual Studio Update-Database aus:

Update-Database

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 Paket-Manager-Konsole von Visual Studio Get-Migration aus:

Get-Migration

Wenn mehrere Datenbankkontexte vorhanden sind, geben Sie den Kontext über den -Context-Parameter an.

Formatieren 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 unterschiedlichen Stile zu behandeln:

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 eines benutzerdefinierten Layouts mit Blazor-App-Formatvorlagen

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.

Gerüstbau für Identity in einer serverseitigen Blazor-App mit Autorisierung

Führen Sie das Identity-Gerüst aus:

  • Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie dann >Hinzufügen>Neues Gerüstelement aus.
  • Wählen Sie im linken Bereich des Dialogfelds Neues Gerüstelement hinzufügen die Option Identity aus. Wählen Sie im mittleren Bereich die Option Identity aus. Wählen Sie die Schaltfläche Hinzufügen aus.
  • Wählen Sie im Dialogfeld Identity hinzufügen die gewünschten Optionen aus.
    • Wenn Sie über eine vorhandene, angepasste Layoutseite für Identity (_Layout.cshtml) verfügen, wählen Sie Ihre vorhandene Layoutseite aus, um zu vermeiden, dass Ihr Layout mit falschem Markup vom Gerüst überschrieben wird. Wählen Sie z. B. 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- oder Blazor Server-Projekte mit vorhandener MVC-Infrastruktur
    • Für den Datenkontext (DbContext-Klasse):
      • Wählen Sie Ihre Datenkontextklasse aus. Sie müssen mindestens eine Datei auswählen, um Ihren Datenkontext hinzuzufügen.
      • Um einen Datenkontext zu erstellen und möglicherweise eine neue User-Klasse für Identity zu erstellen, wählen Sie die Schaltfläche + aus. Übernehmen Sie den Standardwert, oder geben Sie eine Klasse an (z. B. Contoso.Data.ApplicationDbContext für ein Unternehmen mit dem Namen „Contoso“). Um eine neue Benutzerklasse zu erstellen, wählen Sie die Schaltfläche +für die User-Klasse aus, und geben Sie die Klasse an (z. B. ContosoUser für ein Unternehmen mit dem Namen „Contoso“).
    • Wählen Sie die Schaltfläche 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. Bei serverseitigen ASP.NET Core-Apps gehosteter Blazor-Lösungen können Sie die Leitfäden zu Razor Pages/MVC in diesem Artikel befolgen. Sie werden wie jeder andere Typ von ASP.NET Core-Apps konfiguriert, die Identity unterstützen.

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

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

Erstellen einer vollständigen Quelle für die Identity-Benutzeroberfläche

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

Im folgenden Code wird die Standard-Identity 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. InputModelPassword-Eigenschaften finden Sie in den folgenden Dateien:

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

Deaktivieren einer Seite

In diesem Abschnitt wird gezeigt, wie Sie die 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 Seite Areas/Identity/Pages/Account/RegisterConfirmation.

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

Verwenden einer anderen App zum Hinzufügen von 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.
  • Der Benutzer*innen werden der 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