Einführung in Identity ASP.net CoreIntroduction to Identity on ASP.NET Core

Von Rick AndersonBy Rick Anderson

ASP.NET Core Identity:ASP.NET Core Identity:

  • Ist eine API, die die Benutzeroberflächen-Anmelde Funktionalität unterstützt.Is an API that supports user interface (UI) login functionality.
  • Von werden Benutzer, Kenn Wörter, Profildaten, Rollen, Ansprüche, Token, e-Mail-Bestätigung und mehr verwaltet.Manages users, passwords, profile data, roles, claims, tokens, email confirmation, and more.

Benutzer können ein Konto mit den Anmelde Informationen erstellen, die in gespeichert Identity sind, oder Sie können einen externen Anmelde Anbieter verwenden.Users can create an account with the login information stored in Identity or they can use an external login provider. Zu den unterstützten externen Anmelde Anbietern zählen Facebook, Google, Microsoft-Konto und Twitter.Supported external login providers include Facebook, Google, Microsoft Account, and Twitter.

Informationen dazu, wie Global alle Benutzer authentifiziert werden müssen, finden Sie unter Anfordern von authentifizierten Benutzern.For information on how to globally require all users to be authenticated, see Require authenticated users.

Der Identity Quellcode ist auf GitHub verfügbar.The Identity source code is available on GitHub. Gerüst Identity und zeigen Sie die generierten Dateien an, um die Vorlagen Interaktion mit zu überprüfen Identity .Scaffold Identity and view the generated files to review the template interaction with Identity.

Identitywird in der Regel mit einer SQL Server Datenbank konfiguriert, um Benutzernamen, Kenn Wörter und Profildaten zu speichern.Identity is typically configured using a SQL Server database to store user names, passwords, and profile data. Alternativ können Sie auch einen weiteren permanenten Speicher verwenden, z. b. Azure Table Storage.Alternatively, another persistent store can be used, for example, Azure Table Storage.

In diesem Thema erfahren Sie, wie Sie Identity einen Benutzer mit registrieren, anmelden und abmelden.In this topic, you learn how to use Identity to register, log in, and log out a user. Hinweis: die Vorlagen behandeln Benutzername und e-Mail-Adresse für Benutzer als identisch.Note: the templates treat username and email as the same for users. Ausführlichere Anweisungen zum Erstellen von apps, die verwenden Identity , finden Sie unter Nächste Schritte.For more detailed instructions about creating apps that use Identity, see Next Steps.

Die Microsoft Identity-Plattform ist:Microsoft identity platform is:

  • Eine Weiterentwicklung der Azure Active Directory (Azure AD)-Entwicklerplattform.An evolution of the Azure Active Directory (Azure AD) developer platform.
  • Nicht im Zusammenhang mit ASP.net Core Identity .Unrelated to ASP.NET Core Identity.

ASP.NET Core Identity fügt Benutzeroberflächen-Anmeldefunktionen zu ASP.NET Core-Web-Apps hinzu.ASP.NET Core Identity adds user interface (UI) login functionality to ASP.NET Core web apps. Verwenden Sie zum Sichern von Web-APIs und SPAs eine der folgenden Optionen:To secure web APIs and SPAs, use one of the following:

IdentityServer4 ist ein OpenID Connect- und OAuth 2.0-Framework für ASP.NET Core.IdentityServer4 is an OpenID Connect and OAuth 2.0 framework for ASP.NET Core. IdentityServer4 ermöglicht die folgenden Sicherheitsfeatures:IdentityServer4 enables the following security features:

  • Authentifizierung als DienstAuthentication as a Service (AaaS)
  • Einmaliges Anmelden und einmaliges Abmelden für mehrere AnwendungstypenSingle sign-on/off (SSO) over multiple application types
  • Zugriffssteuerung für APIsAccess control for APIs
  • Federation GatewayFederation Gateway

Weitere Informationen finden Sie unter Willkommen bei IdentityServer4.For more information, see Welcome to IdentityServer4.

Anzeigen oder Herunterladen des Beispielcodes (herunterladen)View or download the sample code (how to download)).

Erstellen einer Web-App mit AuthentifizierungCreate a Web app with authentication

Erstellen Sie ein ASP.net Core Webanwendungs Projekt mit einzelnen Benutzerkonten.Create an ASP.NET Core Web Application project with Individual User Accounts.

  • Wählen Sie Datei > neu > Projektaus.Select File > New > Project.
  • Wählen Sie ASP.NET Core-Webanwendung aus.Select ASP.NET Core Web Application. Nennen Sie das Projekt "WebApp1" , um den gleichen Namespace wie das Projekt herunterzuladen.Name the project WebApp1 to have the same namespace as the project download. Klicken Sie auf OK.Click OK.
  • Wählen Sie eine ASP.net Core Webanwendung, und wählen Sie dann Authentifizierung ändernaus.Select an ASP.NET Core Web Application, then select Change Authentication.
  • Wählen Sie einzelne Benutzerkonten , und klicken Sie auf OK.Select Individual User Accounts and click OK.

Das generierte Projekt stellt ASP.net Core Identity als Razor Klassenbibliothekbereit.The generated project provides ASP.NET Core Identity as a Razor Class Library. Die Identity Razor Klassenbibliothek macht Endpunkte mit dem Identity Bereich verfügbar.The Identity Razor Class Library exposes endpoints with the Identity area. Beispiel:For example:

  • /Identity/Account/Login/Identity/Account/Login
  • /Identity/Account/Logout/Identity/Account/Logout
  • /Identity/Account/Manage/Identity/Account/Manage

Anwenden von MigrationenApply migrations

Wenden Sie die Migrationen an, um die Datenbank zu initialisieren.Apply the migrations to initialize the database.

Führen Sie den folgenden Befehl in der Paket-Manager-Konsole (PMC) aus:Run the following command in the Package Manager Console (PMC):

PM> Update-Database

Test Registrierung und AnmeldungTest Register and Login

Führen Sie die APP aus, und registrieren Sie einen Benutzer.Run the app and register a user. Abhängig von der Bildschirmgröße müssen Sie ggf. die Navigations Schaltfläche auswählen, um die Links registrieren und Anmelden anzuzeigen.Depending on your screen size, you might need to select the navigation toggle button to see the Register and Login links.

Anzeigen der IdentitätsdatenbankView the Identity database

  • Wählen Sie im Menü Ansicht die Option SQL Server-Objekt-Explorer (ssox) aus.From the View menu, select SQL Server Object Explorer (SSOX).
  • Navigieren Sie zu (localdb) mssqllocaldb (SQL Server 13) .Navigate to (localdb)MSSQLLocalDB(SQL Server 13). Klicken Sie mit der rechten Maustaste auf dbo. Aspnettusers > Anzeigen von Daten:Right-click on dbo.AspNetUsers > View Data:

Kontextmenü für die aspnettusers-Tabelle in SQL Server-Objekt-Explorer

IdentityDienste konfigurierenConfigure Identity services

Dienste werden in hinzugefügt ConfigureServices .Services are added in ConfigureServices. Das typische Muster besteht darin, alle Add{Service}-Methoden und dann alle services.Configure{Service}-Methoden aufzurufen.The typical pattern is to call all the Add{Service} methods, and then call all the services.Configure{Service} methods.

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
     // options.UseSqlite(
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
        .AddEntityFrameworkStores<ApplicationDbContext>();
    services.AddRazorPages();

    services.Configure<IdentityOptions>(options =>
    {
        // Password settings.
        options.Password.RequireDigit = true;
        options.Password.RequireLowercase = true;
        options.Password.RequireNonAlphanumeric = true;
        options.Password.RequireUppercase = true;
        options.Password.RequiredLength = 6;
        options.Password.RequiredUniqueChars = 1;

        // Lockout settings.
        options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
        options.Lockout.MaxFailedAccessAttempts = 5;
        options.Lockout.AllowedForNewUsers = true;

        // User settings.
        options.User.AllowedUserNameCharacters =
        "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
        options.User.RequireUniqueEmail = false;
    });

    services.ConfigureApplicationCookie(options =>
    {
        // Cookie settings
        options.Cookie.HttpOnly = true;
        options.ExpireTimeSpan = TimeSpan.FromMinutes(5);

        options.LoginPath = "/Identity/Account/Login";
        options.AccessDeniedPath = "/Identity/Account/AccessDenied";
        options.SlidingExpiration = true;
    });
}

Der vorangehende markierte Code konfiguriert Identity mit Standard Options Werten.The preceding highlighted code configures Identity with default option values. Dienste werden über die Abhängigkeitsinjektionder App zur Verfügung gestellt.Services are made available to the app through dependency injection.

Identitywird aktiviert, indem aufgerufen wird UseAuthentication .Identity is enabled by calling UseAuthentication. UseAuthenticationFügt der Anforderungs Pipeline Authentifizierungs Middleware hinzu.UseAuthentication adds authentication middleware to the request pipeline.

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 von der Vorlage generierte App verwendet keine Autorisierung.The template-generated app doesn't use authorization. app.UseAuthorizationist enthalten, um sicherzustellen, dass Sie in der richtigen Reihenfolge hinzugefügt wird, wenn die APP eine Autorisierungapp.UseAuthorization is included to ensure it's added in the correct order should the app add authorization. UseRouting, UseAuthentication , UseAuthorization und UseEndpoints müssen in der Reihenfolge aufgerufen werden, die im vorangehenden Code angezeigt wird.UseRouting, UseAuthentication, UseAuthorization, and UseEndpoints must be called in the order shown in the preceding code.

Weitere Informationen zu IdentityOptions und Startup finden Sie unter IdentityOptions und Anwendungsstart.For more information on IdentityOptions and Startup, see IdentityOptions and Application Startup.

Gerüst Register, anmelden, abmelden und Register BestätigungScaffold Register, Login, LogOut, and RegisterConfirmation

Fügen Sie Register die Login Dateien,, LogOut und hinzu RegisterConfirmation .Add the Register, Login, LogOut, and RegisterConfirmation files. Befolgen Sie die Gerüst Identität in einem Razor Projekt mit Autorisierungs Anweisungen, um den in diesem Abschnitt gezeigten Code zu generieren.Follow the Scaffold identity into a Razor project with authorization instructions to generate the code shown in this section.

Register überprüfenExamine Register

Wenn ein Benutzer auf die Schaltfläche registrieren auf der Register Seite klickt, RegisterModel.OnPostAsync wird die Aktion aufgerufen.When a user clicks the Register button on the Register page, the RegisterModel.OnPostAsync action is invoked. Der Benutzer wird von " kreateasync " für das _userManager Objekt erstellt:The user is created by CreateAsync on the _userManager object:

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    returnUrl = returnUrl ?? Url.Content("~/");
    ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync())
                                          .ToList();
    if (ModelState.IsValid)
    {
        var user = new IdentityUser { UserName = Input.Email, Email = Input.Email };
        var result = await _userManager.CreateAsync(user, Input.Password);
        if (result.Succeeded)
        {
            _logger.LogInformation("User created a new account with password.");

            var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
            code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
            var callbackUrl = Url.Page(
                "/Account/ConfirmEmail",
                pageHandler: null,
                values: new { area = "Identity", userId = user.Id, code = code },
                protocol: Request.Scheme);

            await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
                $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");

            if (_userManager.Options.SignIn.RequireConfirmedAccount)
            {
                return RedirectToPage("RegisterConfirmation", 
                                      new { email = Input.Email });
            }
            else
            {
                await _signInManager.SignInAsync(user, isPersistent: false);
                return LocalRedirect(returnUrl);
            }
        }
        foreach (var error in result.Errors)
        {
            ModelState.AddModelError(string.Empty, error.Description);
        }
    }

    // If we got this far, something failed, redisplay form
    return Page();
}

Standardkonto Überprüfung deaktivierenDisable default account verification

Mit den Standardvorlagen wird der Benutzer an den umgeleitet, Account.RegisterConfirmation wo er einen Link auswählen kann, um das Konto zu bestätigen.With the default templates, the user is redirected to the Account.RegisterConfirmation where they can select a link to have the account confirmed. Der Standardwert Account.RegisterConfirmation wird nur für Tests verwendet, die automatische Kontoüberprüfung sollte in einer Produktions-App deaktiviert werden.The default Account.RegisterConfirmation is used only for testing, automatic account verification should be disabled in a production app.

Wenn Sie ein bestätigtes Konto benötigen und eine sofortige Anmeldung bei der Registrierung verhindern möchten, legen Sie DisplayConfirmAccountLink = false in /Areas/Identity/Pages/Account/RegisterConfirmation.cshtml.csfest:To require a confirmed account and prevent immediate login at registration, set DisplayConfirmAccountLink = false in /Areas/Identity/Pages/Account/RegisterConfirmation.cshtml.cs:

[AllowAnonymous]
public class RegisterConfirmationModel : PageModel
{
    private readonly UserManager<IdentityUser> _userManager;
    private readonly IEmailSender _sender;

    public RegisterConfirmationModel(UserManager<IdentityUser> userManager, IEmailSender sender)
    {
        _userManager = userManager;
        _sender = sender;
    }

    public string Email { get; set; }

    public bool DisplayConfirmAccountLink { get; set; }

    public string EmailConfirmationUrl { get; set; }

    public async Task<IActionResult> OnGetAsync(string email, string returnUrl = null)
    {
        if (email == null)
        {
            return RedirectToPage("/Index");
        }

        var user = await _userManager.FindByEmailAsync(email);
        if (user == null)
        {
            return NotFound($"Unable to load user with email '{email}'.");
        }

        Email = email;
        // Once you add a real email sender, you should remove this code that lets you confirm the account
        DisplayConfirmAccountLink = false;
        if (DisplayConfirmAccountLink)
        {
            var userId = await _userManager.GetUserIdAsync(user);
            var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
            code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
            EmailConfirmationUrl = Url.Page(
                "/Account/ConfirmEmail",
                pageHandler: null,
                values: new { area = "Identity", userId = userId, code = code, returnUrl = returnUrl },
                protocol: Request.Scheme);
        }

        return Page();
    }
}

AnmeldenLog in

Das Anmeldeformular wird angezeigt, wenn Folgendes gilt:The Login form is displayed when:

  • Der Link " Anmelden " ist ausgewählt.The Log in link is selected.
  • Ein Benutzer versucht, auf eine eingeschränkte Seite zuzugreifen, für die er nicht autorisiert ist, oder wenn er nicht vom System authentifiziert wurde.A user attempts to access a restricted page that they aren't authorized to access or when they haven't been authenticated by the system.

Wenn das Formular auf der Anmeldeseite übermittelt wird, OnPostAsync wird die Aktion aufgerufen.When the form on the Login page is submitted, the OnPostAsync action is called. PasswordSignInAsyncwird für das- _signInManager Objekt aufgerufen.PasswordSignInAsync is called on the _signInManager object.

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    returnUrl = returnUrl ?? Url.Content("~/");

    if (ModelState.IsValid)
    {
        // This doesn't count login failures towards account lockout
        // To enable password failures to trigger account lockout, 
        // set lockoutOnFailure: true
        var result = await _signInManager.PasswordSignInAsync(Input.Email,
                           Input.Password, Input.RememberMe, lockoutOnFailure: true);
        if (result.Succeeded)
        {
            _logger.LogInformation("User logged in.");
            return LocalRedirect(returnUrl);
        }
        if (result.RequiresTwoFactor)
        {
            return RedirectToPage("./LoginWith2fa", new
            {
                ReturnUrl = returnUrl,
                RememberMe = Input.RememberMe
            });
        }
        if (result.IsLockedOut)
        {
            _logger.LogWarning("User account locked out.");
            return RedirectToPage("./Lockout");
        }
        else
        {
            ModelState.AddModelError(string.Empty, "Invalid login attempt.");
            return Page();
        }
    }

    // If we got this far, something failed, redisplay form
    return Page();
}

Informationen dazu, wie Sie Autorisierungs Entscheidungen treffen, finden Sie unter Einführung in die Autorisierung in ASP.net Core .For information on how to make authorization decisions, see Einführung in die Autorisierung in ASP.net Core.

AbmeldenLog out

Der Link " Abmelden " Ruft die LogoutModel.OnPost Aktion auf.The Log out link invokes the LogoutModel.OnPost action.

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;

namespace WebApp1.Areas.Identity.Pages.Account
{
    [AllowAnonymous]
    public class LogoutModel : PageModel
    {
        private readonly SignInManager<IdentityUser> _signInManager;
        private readonly ILogger<LogoutModel> _logger;

        public LogoutModel(SignInManager<IdentityUser> signInManager, ILogger<LogoutModel> logger)
        {
            _signInManager = signInManager;
            _logger = logger;
        }

        public void OnGet()
        {
        }

        public async Task<IActionResult> OnPost(string returnUrl = null)
        {
            await _signInManager.SignOutAsync();
            _logger.LogInformation("User logged out.");
            if (returnUrl != null)
            {
                return LocalRedirect(returnUrl);
            }
            else
            {
                return RedirectToPage();
            }
        }
    }
}

Im vorangehenden Code muss der Code return RedirectToPage(); eine Umleitung sein, damit der Browser eine neue Anforderung ausführt und die Identität des Benutzers aktualisiert wird.In the preceding code, the code return RedirectToPage(); needs to be a redirect so that the browser performs a new request and the identity for the user gets updated.

Signoutasync löscht die in einem Cookie gespeicherten Ansprüche des Benutzers.SignOutAsync clears the user's claims stored in a cookie.

Post wird in der Datei pages/Shared/_LoginPartial. cshtmlangegeben:Post is specified in the Pages/Shared/_LoginPartial.cshtml:

@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager

<ul class="navbar-nav">
@if (SignInManager.IsSignedIn(User))
{
    <li class="nav-item">
        <a  class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Manage/Index" 
                                              title="Manage">Hello @User.Identity.Name!</a>
    </li>
    <li class="nav-item">
        <form class="form-inline" asp-area="Identity" asp-page="/Account/Logout" 
                                  asp-route-returnUrl="@Url.Page("/", new { area = "" })" 
                                  method="post" >
            <button  type="submit" class="nav-link btn btn-link text-dark">Logout</button>
        </form>
    </li>
}
else
{
    <li class="nav-item">
        <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Register">Register</a>
    </li>
    <li class="nav-item">
        <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
    </li>
}
</ul>

TestIdentityTest Identity

Die Standardweb Projektvorlagen ermöglichen den anonymen Zugriff auf die Startseiten.The default web project templates allow anonymous access to the home pages. IdentityFügen Sie zum Testen Folgendes hinzu [Authorize] :To test Identity, add [Authorize]:

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;

namespace WebApp1.Pages
{
    [Authorize]
    public class PrivacyModel : PageModel
    {
        private readonly ILogger<PrivacyModel> _logger;

        public PrivacyModel(ILogger<PrivacyModel> logger)
        {
            _logger = logger;
        }

        public void OnGet()
        {
        }
    }
}

Wenn Sie angemeldet sind, melden Sie sich ab. Führen Sie die APP aus, und wählen Sie den Datenschutz Link.If you are signed in, sign out. Run the app and select the Privacy link. Sie werden zur Anmeldeseite umgeleitet.You are redirected to the login page.

EntdeckenIdentityExplore Identity

Weitere Informationen finden Sie unter Identity :To explore Identity in more detail:

IdentityKomponentenIdentity Components

Alle Identity -abhängigen nuget-Pakete sind im ASP.net Core frei gegebenen Frameworkenthalten.All the Identity-dependent NuGet packages are included in the ASP.NET Core shared framework.

Das primäre Paket für Identity ist Microsoft. aspnetcore. Identity The primary package for Identity is Microsoft.AspNetCore.Identity. Dieses Paket enthält den Kernsatz von Schnittstellen für ASP.net Core Identity und ist in enthalten Microsoft.AspNetCore.Identity.EntityFrameworkCore .This package contains the core set of interfaces for ASP.NET Core Identity, and is included by Microsoft.AspNetCore.Identity.EntityFrameworkCore.

Migrieren zu ASP.net CoreIdentityMigrating to ASP.NET Core Identity

Weitere Informationen und Anleitungen zum Migrieren Ihres vorhandenen Identity Stores finden Sie unter Migrieren Identity der Authentifizierung und .For more information and guidance on migrating your existing Identity store, see Migrate Authentication and Identity.

Festlegen der Kenn Wort StärkeSetting password strength

Ein Beispiel zum Festlegen der Mindestanforderungen für das Kennwort finden Sie unter Konfiguration .See Configuration for a sample that sets the minimum password requirements.

Adddefault Identity und AddIdentityAddDefaultIdentity and AddIdentity

AddDefaultIdentitywurde in ASP.net Core 2,1 eingeführt.AddDefaultIdentity was introduced in ASP.NET Core 2.1. AddDefaultIdentityDas Aufrufen von ähnelt dem Aufrufen der folgenden:Calling AddDefaultIdentity is similar to calling the following:

Weitere Informationen finden Sie unter adddefault Identity Source .See AddDefaultIdentity source for more information.

Veröffentlichen statischer Identity Assets verhindernPrevent publish of static Identity assets

Identity Identity Fügen Sie die folgende ResolveStaticWebAssetsInputsDependsOn Eigenschaft und das RemoveIdentityAssets Ziel der Projektdatei der APP hinzu, um zu verhindern, dass statische Assets (Stylesheets und JavaScript-Dateien für die Benutzeroberfläche) im Webstamm Verzeichnis veröffentlicht werden:To prevent publishing static Identity assets (stylesheets and JavaScript files for Identity UI) to the web root, add the following ResolveStaticWebAssetsInputsDependsOn property and RemoveIdentityAssets target to the app's project file:

<PropertyGroup>
  <ResolveStaticWebAssetsInputsDependsOn>RemoveIdentityAssets</ResolveStaticWebAssetsInputsDependsOn>
</PropertyGroup>

<Target Name="RemoveIdentityAssets">
  <ItemGroup>
    <StaticWebAsset Remove="@(StaticWebAsset)" Condition="%(SourceId) == 'Microsoft.AspNetCore.Identity.UI'" />
  </ItemGroup>
</Target>

Nächste SchritteNext Steps

Von Rick AndersonBy Rick Anderson

ASP.net Core Identity ist ein Mitgliedschaftssystem, das ASP.net Core-apps Anmelde Funktionalität hinzufügt.ASP.NET Core Identity is a membership system that adds login functionality to ASP.NET Core apps. Benutzer können ein Konto mit den Anmelde Informationen erstellen, die in gespeichert Identity sind, oder Sie können einen externen Anmelde Anbieter verwenden.Users can create an account with the login information stored in Identity or they can use an external login provider. Zu den unterstützten externen Anmelde Anbietern zählen Facebook, Google, Microsoft-Konto und Twitter.Supported external login providers include Facebook, Google, Microsoft Account, and Twitter.

Identitykann mithilfe einer SQL Server-Datenbank zum Speichern von Benutzernamen, Kenn Wörtern und Profildaten konfiguriert werden.Identity can be configured using a SQL Server database to store user names, passwords, and profile data. Alternativ können Sie auch einen weiteren permanenten Speicher verwenden, z. b. Azure Table Storage.Alternatively, another persistent store can be used, for example, Azure Table Storage.

Anzeigen oder Herunterladen des Beispielcodes (herunterladen)View or download the sample code (how to download)).

In diesem Thema erfahren Sie, wie Sie Identity einen Benutzer mit registrieren, anmelden und abmelden.In this topic, you learn how to use Identity to register, log in, and log out a user. Ausführlichere Anweisungen zum Erstellen von apps, die verwenden Identity , finden Sie im Abschnitt nächste Schritte am Ende dieses Artikels.For more detailed instructions about creating apps that use Identity, see the Next Steps section at the end of this article.

Adddefault Identity und AddIdentityAddDefaultIdentity and AddIdentity

AddDefaultIdentitywurde in ASP.net Core 2,1 eingeführt.AddDefaultIdentity was introduced in ASP.NET Core 2.1. AddDefaultIdentityDas Aufrufen von ähnelt dem Aufrufen der folgenden:Calling AddDefaultIdentity is similar to calling the following:

Weitere Informationen finden Sie unter adddefault Identity Source .See AddDefaultIdentity source for more information.

Erstellen einer Web-App mit AuthentifizierungCreate a Web app with authentication

Erstellen Sie ein ASP.net Core Webanwendungs Projekt mit einzelnen Benutzerkonten.Create an ASP.NET Core Web Application project with Individual User Accounts.

  • Wählen Sie Datei > neu > Projektaus.Select File > New > Project.
  • Wählen Sie ASP.NET Core-Webanwendung aus.Select ASP.NET Core Web Application. Nennen Sie das Projekt "WebApp1" , um den gleichen Namespace wie das Projekt herunterzuladen.Name the project WebApp1 to have the same namespace as the project download. Klicken Sie auf OK.Click OK.
  • Wählen Sie eine ASP.net Core Webanwendung, und wählen Sie dann Authentifizierung ändernaus.Select an ASP.NET Core Web Application, then select Change Authentication.
  • Wählen Sie einzelne Benutzerkonten , und klicken Sie auf OK.Select Individual User Accounts and click OK.

Das generierte Projekt stellt ASP.net Core Identity als Razor Klassenbibliothekbereit.The generated project provides ASP.NET Core Identity as a Razor Class Library. Die Identity Razor Klassenbibliothek macht Endpunkte mit dem Identity Bereich verfügbar.The Identity Razor Class Library exposes endpoints with the Identity area. Beispiel:For example:

  • /Identity/Account/Login/Identity/Account/Login
  • /Identity/Account/Logout/Identity/Account/Logout
  • /Identity/Account/Manage/Identity/Account/Manage

Anwenden von MigrationenApply migrations

Wenden Sie die Migrationen an, um die Datenbank zu initialisieren.Apply the migrations to initialize the database.

Führen Sie den folgenden Befehl in der Paket-Manager-Konsole (PMC) aus:Run the following command in the Package Manager Console (PMC):

Update-Database

Test Registrierung und AnmeldungTest Register and Login

Führen Sie die APP aus, und registrieren Sie einen Benutzer.Run the app and register a user. Abhängig von der Bildschirmgröße müssen Sie ggf. die Navigations Schaltfläche auswählen, um die Links registrieren und Anmelden anzuzeigen.Depending on your screen size, you might need to select the navigation toggle button to see the Register and Login links.

Anzeigen der IdentitätsdatenbankView the Identity database

  • Wählen Sie im Menü Ansicht die Option SQL Server-Objekt-Explorer (ssox) aus.From the View menu, select SQL Server Object Explorer (SSOX).
  • Navigieren Sie zu (localdb) mssqllocaldb (SQL Server 13) .Navigate to (localdb)MSSQLLocalDB(SQL Server 13). Klicken Sie mit der rechten Maustaste auf dbo. Aspnettusers > Anzeigen von Daten:Right-click on dbo.AspNetUsers > View Data:

Kontextmenü für die aspnettusers-Tabelle in SQL Server-Objekt-Explorer

IdentityDienste konfigurierenConfigure Identity services

Dienste werden in hinzugefügt ConfigureServices .Services are added in ConfigureServices. Das typische Muster besteht darin, alle Add{Service}-Methoden und dann alle services.Configure{Service}-Methoden aufzurufen.The typical pattern is to call all the Add{Service} methods, and then call all the services.Configure{Service} methods.

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.AddDefaultIdentity<IdentityUser>()
        .AddDefaultUI(UIFramework.Bootstrap4)
        .AddEntityFrameworkStores<ApplicationDbContext>();

    services.Configure<IdentityOptions>(options =>
    {
        // Password settings.
        options.Password.RequireDigit = true;
        options.Password.RequireLowercase = true;
        options.Password.RequireNonAlphanumeric = true;
        options.Password.RequireUppercase = true;
        options.Password.RequiredLength = 6;
        options.Password.RequiredUniqueChars = 1;

        // Lockout settings.
        options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
        options.Lockout.MaxFailedAccessAttempts = 5;
        options.Lockout.AllowedForNewUsers = true;

        // User settings.
        options.User.AllowedUserNameCharacters =
        "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
        options.User.RequireUniqueEmail = false;
    });

    services.ConfigureApplicationCookie(options =>
    {
        // Cookie settings
        options.Cookie.HttpOnly = true;
        options.ExpireTimeSpan = TimeSpan.FromMinutes(5);

        options.LoginPath = "/Identity/Account/Login";
        options.AccessDeniedPath = "/Identity/Account/AccessDenied";
        options.SlidingExpiration = true;
    });

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

Der vorangehende Code konfiguriert Identity mit Standard Options Werten.The preceding code configures Identity with default option values. Dienste werden über die Abhängigkeitsinjektionder App zur Verfügung gestellt.Services are made available to the app through dependency injection.

Identitywird durch Aufrufen von UseAuthenticationaktiviert.Identity is enabled by calling UseAuthentication. UseAuthenticationFügt der Anforderungs Pipeline Authentifizierungs Middleware hinzu.UseAuthentication adds authentication middleware to the request pipeline.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

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

    app.UseAuthentication();

    app.UseMvc();
}

Weitere Informationen finden Sie unter der Identity options-Klasse und dem Anwendungsstart.For more information, see the IdentityOptions Class and Application Startup.

Gerüst: registrieren, anmelden und AbmeldenScaffold Register, Login, and LogOut

Befolgen Sie die Gerüst Identität in einem Razor Projekt mit Autorisierungs Anweisungen, um den in diesem Abschnitt gezeigten Code zu generieren.Follow the Scaffold identity into a Razor project with authorization instructions to generate the code shown in this section.

Fügen Sie die Registrierungs-, Anmelde-und Abmelde Dateien hinzu.Add the Register, Login, and LogOut files.

Register überprüfenExamine Register

Wenn ein Benutzer auf den Link registrieren klickt, RegisterModel.OnPostAsync wird die Aktion aufgerufen.When a user clicks the Register link, the RegisterModel.OnPostAsync action is invoked. Der Benutzer wird von " kreateasync " für das _userManager Objekt erstellt:The user is created by CreateAsync on the _userManager object:

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    returnUrl = returnUrl ?? Url.Content("~/");
    if (ModelState.IsValid)
    {
        var user = new IdentityUser { UserName = Input.Email, Email = Input.Email };
        var result = await _userManager.CreateAsync(user, Input.Password);
        if (result.Succeeded)
        {
            _logger.LogInformation("User created a new account with password.");

            var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
            var callbackUrl = Url.Page(
                "/Account/ConfirmEmail",
                pageHandler: null,
                values: new { userId = user.Id, code = code },
                protocol: Request.Scheme);

            await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
                $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");

            await _signInManager.SignInAsync(user, isPersistent: false);
            return LocalRedirect(returnUrl);
        }
        foreach (var error in result.Errors)
        {
            ModelState.AddModelError(string.Empty, error.Description);
        }
    }

    // If we got this far, something failed, redisplay form
    return Page();
}

Wenn der Benutzer erfolgreich erstellt wurde, wird der Benutzer durch den-Befehl angemeldet _signInManager.SignInAsync .If the user was created successfully, the user is logged in by the call to _signInManager.SignInAsync.

Hinweis: Unter Konto Bestätigung finden Sie Schritte zum Verhindern der sofortigen Anmeldung bei der Registrierung.Note: See account confirmation for steps to prevent immediate login at registration.

AnmeldenLog in

Das Anmeldeformular wird angezeigt, wenn Folgendes gilt:The Login form is displayed when:

  • Der Link " Anmelden " ist ausgewählt.The Log in link is selected.
  • Ein Benutzer versucht, auf eine eingeschränkte Seite zuzugreifen, für die er nicht autorisiert ist, oder wenn er nicht vom System authentifiziert wurde.A user attempts to access a restricted page that they aren't authorized to access or when they haven't been authenticated by the system.

Wenn das Formular auf der Anmeldeseite übermittelt wird, OnPostAsync wird die Aktion aufgerufen.When the form on the Login page is submitted, the OnPostAsync action is called. PasswordSignInAsyncwird für das- _signInManager Objekt aufgerufen.PasswordSignInAsync is called on the _signInManager object.

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
    returnUrl = returnUrl ?? Url.Content("~/");

    if (ModelState.IsValid)
    {
        // This doesn't count login failures towards account lockout
        // To enable password failures to trigger account lockout, 
        // set lockoutOnFailure: true
        var result = await _signInManager.PasswordSignInAsync(Input.Email, 
            Input.Password, Input.RememberMe, lockoutOnFailure: true);
        if (result.Succeeded)
        {
            _logger.LogInformation("User logged in.");
            return LocalRedirect(returnUrl);
        }
        if (result.RequiresTwoFactor)
        {
            return RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl, RememberMe = Input.RememberMe });
        }
        if (result.IsLockedOut)
        {
            _logger.LogWarning("User account locked out.");
            return RedirectToPage("./Lockout");
        }
        else
        {
            ModelState.AddModelError(string.Empty, "Invalid login attempt.");
            return Page();
        }
    }

    // If we got this far, something failed, redisplay form
    return Page();
}

Informationen dazu, wie Sie Autorisierungs Entscheidungen treffen, finden Sie unter Einführung in die Autorisierung in ASP.net Core .For information on how to make authorization decisions, see Einführung in die Autorisierung in ASP.net Core.

AbmeldenLog out

Der Link " Abmelden " Ruft die LogoutModel.OnPost Aktion auf.The Log out link invokes the LogoutModel.OnPost action.

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;

namespace WebApp1.Areas.Identity.Pages.Account
{
    [AllowAnonymous]
    public class LogoutModel : PageModel
    {
        private readonly SignInManager<IdentityUser> _signInManager;
        private readonly ILogger<LogoutModel> _logger;

        public LogoutModel(SignInManager<IdentityUser> signInManager, ILogger<LogoutModel> logger)
        {
            _signInManager = signInManager;
            _logger = logger;
        }

        public void OnGet()
        {
        }

        public async Task<IActionResult> OnPost(string returnUrl = null)
        {
            await _signInManager.SignOutAsync();
            _logger.LogInformation("User logged out.");
            if (returnUrl != null)
            {
                return LocalRedirect(returnUrl);
            }
            else
            {
                // This needs to be a redirect so that the browser performs a new
                // request and the identity for the user gets updated.
                return RedirectToPage();
            }
        }
    }
}

Signoutasync löscht die in einem Cookie gespeicherten Ansprüche des Benutzers.SignOutAsync clears the user's claims stored in a cookie.

Post wird in der Datei pages/Shared/_LoginPartial. cshtmlangegeben:Post is specified in the Pages/Shared/_LoginPartial.cshtml:

@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager

<ul class="navbar-nav">
    @if (SignInManager.IsSignedIn(User))
    {
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="Identity"
               asp-page="/Account/Manage/Index"
               title="Manage">Hello@User.Identity.Name!</a>
        </li>
        <li class="nav-item">
            <form class="form-inline" asp-area="Identity" asp-page="/Account/Logout" 
                   asp-route-returnUrl="@Url.Page("/", new { area = "" })" 
                   method="post">
                <button type="submit" class="nav-link btn btn-link text-dark">Logout</button>
            </form>
        </li>
    }
    else
    {
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Register">Register</a>
        </li>
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
        </li>
    }
</ul>


TestIdentityTest Identity

Die Standardweb Projektvorlagen ermöglichen den anonymen Zugriff auf die Startseiten.The default web project templates allow anonymous access to the home pages. IdentityFügen Sie zum Testen [Authorize] der Seite Datenschutz hinzu.To test Identity, add [Authorize] to the Privacy page.

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace WebApp1.Pages
{
    [Authorize]
    public class PrivacyModel : PageModel
    {
        public void OnGet()
        {
        }
    }
}

Wenn Sie angemeldet sind, melden Sie sich ab. Führen Sie die APP aus, und wählen Sie den Datenschutz Link.If you are signed in, sign out. Run the app and select the Privacy link. Sie werden zur Anmeldeseite umgeleitet.You are redirected to the login page.

EntdeckenIdentityExplore Identity

Weitere Informationen finden Sie unter Identity :To explore Identity in more detail:

IdentityKomponentenIdentity Components

Alle Identity abhängigen nuget-Pakete sind im Metapaket Microsoft. aspnetcore. appenthalten.All the Identity dependent NuGet packages are included in the Microsoft.AspNetCore.App metapackage.

Das primäre Paket für Identity ist Microsoft. aspnetcore. Identity The primary package for Identity is Microsoft.AspNetCore.Identity. Dieses Paket enthält den Kernsatz von Schnittstellen für ASP.net Core Identity und ist in enthalten Microsoft.AspNetCore.Identity.EntityFrameworkCore .This package contains the core set of interfaces for ASP.NET Core Identity, and is included by Microsoft.AspNetCore.Identity.EntityFrameworkCore.

Migrieren zu ASP.net CoreIdentityMigrating to ASP.NET Core Identity

Weitere Informationen und Anleitungen zum Migrieren Ihres vorhandenen Identity Stores finden Sie unter Migrieren Identity der Authentifizierung und .For more information and guidance on migrating your existing Identity store, see Migrate Authentication and Identity.

Festlegen der Kenn Wort StärkeSetting password strength

Ein Beispiel zum Festlegen der Mindestanforderungen für das Kennwort finden Sie unter Konfiguration .See Configuration for a sample that sets the minimum password requirements.

Nächste SchritteNext Steps