Introduzione all'identità in ASP.NET CoreIntroduction to Identity on ASP.NET Core

Autore: Rick AndersonBy Rick Anderson

Identità ASP.NET Core:ASP.NET Core Identity:

  • È un'API che supporta la funzionalità di accesso dell'interfaccia utente.Is an API that supports user interface (UI) login functionality.
  • Gestisce utenti, password, dati di profilo, ruoli, attestazioni, token, conferma tramite posta elettronica e altro ancora.Manages users, passwords, profile data, roles, claims, tokens, email confirmation, and more.

Gli utenti possono creare un account con le informazioni di accesso archiviate in Identity oppure possono usare un provider di accesso esterno.Users can create an account with the login information stored in Identity or they can use an external login provider. I provider di accesso esterni supportati includono Facebook, Google, account Microsoft e Twitter.Supported external login providers include Facebook, Google, Microsoft Account, and Twitter.

Il codice sorgente di identità è disponibile in GitHub.The Identity source code is available on GitHub. Identità del patibolo e visualizzare i file generati per esaminare l'interazione del modello con l'identità.Scaffold Identity and view the generated files to review the template interaction with Identity.

L'identità viene in genere configurata utilizzando un database SQL Server per archiviare i nomi utente, le password e i dati di profilo.Identity is typically configured using a SQL Server database to store user names, passwords, and profile data. In alternativa, è possibile usare un altro archivio permanente, ad esempio archiviazione tabelle di Azure.Alternatively, another persistent store can be used, for example, Azure Table Storage.

In questo argomento si apprenderà come usare l'identità per la registrazione, l'accesso e la disconnessione di un utente.In this topic, you learn how to use Identity to register, log in, and log out a user. Nota: i modelli considerano il nome utente e il messaggio di posta elettronica come lo stesso per gli utenti.Note: the templates treat username and email as the same for users. Per istruzioni più dettagliate sulla creazione di app che usano l'identità, vedere la sezione passaggi successivi alla fine di questo articolo.For more detailed instructions about creating apps that use Identity, see the Next Steps section at the end of this article.

Piattaforma di identità Microsoft :Microsoft identity platform is:

  • Evoluzione della piattaforma per sviluppatori Azure Active Directory (Azure AD).An evolution of the Azure Active Directory (Azure AD) developer platform.
  • Non correlato all'identità del ASP.NET Core.Unrelated to ASP.NET Core Identity.

ASP.NET Core identità aggiunge la funzionalità di accesso dell'interfaccia utente per ASP.NET Core app Web.ASP.NET Core Identity adds user interface (UI) login functionality to ASP.NET Core web apps. Per proteggere le API Web e le Spa, usare uno dei seguenti elementi:To secure web APIs and SPAs, use one of the following:

IdentityServer4 è un Framework di OpenID Connect e OAuth 2,0 per ASP.NET Core 3,0.IdentityServer4 is an OpenID Connect and OAuth 2.0 framework for ASP.NET Core 3.0. IdentityServer4 Abilita le funzionalità di sicurezza seguenti:IdentityServer4 enables the following security features:

  • Autenticazione come servizio (AaaS)Authentication as a Service (AaaS)
  • Single Sign-on/off (SSO) su più tipi di applicazioneSingle sign-on/off (SSO) over multiple application types
  • Controllo di accesso per le APIAccess control for APIs
  • Gateway federativoFederation Gateway

Per ulteriori informazioni, vedere Welcome to IdentityServer4.For more information, see Welcome to IdentityServer4.

Consente di visualizzare o scaricare il codice di esempio (come scaricare).View or download the sample code (how to download)).

Creare un'app Web con l'autenticazioneCreate a Web app with authentication

Creare un progetto di applicazione Web di ASP.NET Core con singoli account utente.Create an ASP.NET Core Web Application project with Individual User Accounts.

  • Selezionare file > nuovo > progetto.Select File > New > Project.
  • Selezionare Applicazione Web ASP.NET Core.Select ASP.NET Core Web Application. Denominare il progetto app Web 1 in modo che abbia lo stesso spazio dei nomi del download del progetto.Name the project WebApp1 to have the same namespace as the project download. Fare clic su OK.Click OK.
  • Selezionare un' applicazione WebASP.NET Core, quindi selezionare Modifica autenticazione.Select an ASP.NET Core Web Application, then select Change Authentication.
  • Selezionare singoli account utente e fare clic su OK.Select Individual User Accounts and click OK.

Il progetto generato fornisce ASP.NET Core identità come libreria di classi Razor.The generated project provides ASP.NET Core Identity as a Razor Class Library. La libreria della classe Razor Identity espone gli endpoint con Identity l'area.The Identity Razor Class Library exposes endpoints with the Identity area. Ad esempio:For example:

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

Applicare le migrazioniApply migrations

Applicare le migrazioni per inizializzare il database.Apply the migrations to initialize the database.

Eseguire il comando seguente nella console di gestione pacchetti (PMC):Run the following command in the Package Manager Console (PMC):

PM> Update-Database

Registro di test e account di accessoTest Register and Login

Eseguire l'app e registrare un utente.Run the app and register a user. A seconda delle dimensioni dello schermo, potrebbe essere necessario selezionare l'interruttore di spostamento per visualizzare i collegamenti di Registro e di accesso .Depending on your screen size, you might need to select the navigation toggle button to see the Register and Login links.

Visualizzare il database di identitàView the Identity database

  • Scegliere Esplora oggetti di SQL Server (SSOX) dal menu Visualizza .From the View menu, select SQL Server Object Explorer (SSOX).
  • Passare a (local DB) MSSQLLocalDB (SQL Server 13) .Navigate to (localdb)MSSQLLocalDB(SQL Server 13). Fare clic con il pulsante destro del mouse su dbo. AspNetUsers > visualizzare i dati:Right-click on dbo.AspNetUsers > View Data:

Menu contestuale nella tabella AspNetUsers in Esplora oggetti di SQL Server

Configurare i servizi di identitàConfigure Identity services

I servizi vengono aggiunti ConfigureServicesin.Services are added in ConfigureServices. Il modello tipico consiste nel chiamare tutti i metodi Add{Service} e quindi chiamare tutti i metodi services.Configure{Service}.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.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;
    });
}

Il codice evidenziato precedente configura l'identità con i valori delle opzioni predefinite.The preceding highlighted code configures Identity with default option values. I servizi vengono resi disponibili per l'applicazione tramite l' inserimento di dipendenze.Services are made available to the app through dependency injection.

L'identità viene abilitata UseAuthenticationchiamando.Identity is enabled by calling UseAuthentication. UseAuthenticationaggiunge il middleware di autenticazione alla pipeline della richiesta.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();
    });
}

L'app generata dal modello non usa l' autorizzazione.The template-generated app doesn't use authorization. app.UseAuthorizationè incluso per assicurarsi che venga aggiunto nell'ordine corretto se l'app aggiunge l'autorizzazione.app.UseAuthorization is included to ensure it's added in the correct order should the app add authorization. UseRouting``UseAuthorization UseEndpoints , UseAuthentication, e devono essere chiamati nell'ordine indicato nel codice precedente.UseRouting, UseAuthentication, UseAuthorization, and UseEndpoints must be called in the order shown in the preceding code.

Per ulteriori informazioni su IdentityOptions e Startup, vedere IdentityOptions e avvio dell'applicazione.For more information on IdentityOptions and Startup, see IdentityOptions and Application Startup.

Registrazione, accesso e disconnessione del patiboloScaffold Register, Login, and LogOut

Aggiungere i file di registro, di accesso e di disconnessione.Add the Register, Login, and LogOut files. Seguire l' identità del patibolo in un progetto Razor con le istruzioni di autorizzazione per generare il codice illustrato in questa sezione.Follow the Scaffold identity into a Razor project with authorization instructions to generate the code shown in this section.

Esaminare il registroExamine Register

Quando un utente fa clic sul collegamento Register , RegisterModel.OnPostAsync viene richiamata l'azione.When a user clicks the Register link, the RegisterModel.OnPostAsync action is invoked. L'utente viene creato da CreateAsync sull' _userManager oggetto.The user is created by CreateAsync on the _userManager object. _userManagerviene fornito dall'inserimento delle dipendenze:_userManager is provided by dependency injection):

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

Se l'utente è stato creato correttamente, l'utente è connesso dalla chiamata a _signInManager.SignInAsync.If the user was created successfully, the user is logged in by the call to _signInManager.SignInAsync.

Vedere la conferma dell'account per i passaggi per impedire l'accesso immediato alla registrazione.See account confirmation for steps to prevent immediate login at registration.

AccessoLog in

Il modulo di accesso viene visualizzato quando:The Login form is displayed when:

  • Il collegamento Accedi è selezionato.The Log in link is selected.
  • Un utente tenta di accedere a una pagina con restrizioni che non è autorizzata ad accedere o quando non è stata autenticata dal sistema.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.

Quando viene inviato il modulo nella pagina di accesso, viene OnPostAsync chiamata l'azione.When the form on the Login page is submitted, the OnPostAsync action is called. PasswordSignInAsyncviene chiamato sull' _signInManager oggetto, fornito dall'inserimento delle dipendenze.PasswordSignInAsync is called on the _signInManager object (provided by dependency injection).

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

La classe Controller base espone una User proprietà a cui è possibile accedere dai metodi del controller.The base Controller class exposes a User property that can be accessed from controller methods. È possibile, ad esempio, User.Claims enumerare e prendere decisioni di autorizzazione.For instance, you can enumerate User.Claims and make authorization decisions. Per altre informazioni, vedere Introduzione all'autorizzazione in ASP.NET Core.For more information, see Introduzione all'autorizzazione in ASP.NET Core.

Effettuare la disconnessioneLog out

Il collegamento Disconnetti richiama l' LogoutModel.OnPost azione.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();
            }
        }
    }
}

Nel codice precedente, il codice return RedirectToPage(); deve essere un reindirizzamento in modo che il browser esegua una nuova richiesta e venga aggiornata l'identità dell'utente.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 Cancella le attestazioni dell'utente archiviate in un cookie.SignOutAsync clears the user's claims stored in a cookie.

Post viene specificato nelle pagine/Shared/_LoginPartial. cshtml: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>

Identità del testTest Identity

I modelli di progetto Web predefiniti consentono l'accesso anonimo alle Home page.The default web project templates allow anonymous access to the home pages. Per verificare l'identità, [Authorize]aggiungere: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()
        {
        }
    }
}

Se è stato eseguito l'accesso, disconnettersi. Eseguire l'app e selezionare il collegamento per la privacy .If you are signed in, sign out. Run the app and select the Privacy link. Si verrà reindirizzati alla pagina di accesso.You are redirected to the login page.

Esplora identitàExplore Identity

Per esplorare l'identità in modo più dettagliato:To explore Identity in more detail:

Componenti IdentityIdentity Components

Tutti i pacchetti NuGet dipendenti dall'identità sono inclusi nel Framework condiviso ASP.NET Core.All the Identity-dependent NuGet packages are included in the ASP.NET Core shared framework.

Il pacchetto primario per Identity è Microsoft. AspNetCore. Identity.The primary package for Identity is Microsoft.AspNetCore.Identity. Questo pacchetto contiene il set principale di interfacce per ASP.NET Core identità ed è incluso in 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.

Migrazione a identità ASP.NET CoreMigrating to ASP.NET Core Identity

Per altre informazioni e indicazioni sulla migrazione dell'archivio identità esistente, vedere eseguire la migrazione dell'autenticazione e dell'identità.For more information and guidance on migrating your existing Identity store, see Migrate Authentication and Identity.

Impostazione della complessità della passwordSetting password strength

Vedere configurazione per un esempio che consente di impostare i requisiti minimi per le password.See Configuration for a sample that sets the minimum password requirements.

AddDefaultIdentity e AddIdentityAddDefaultIdentity and AddIdentity

AddDefaultIdentityè stato introdotto in ASP.NET Core 2,1.AddDefaultIdentity was introduced in ASP.NET Core 2.1. La AddDefaultIdentity chiamata a è simile alla chiamata a quanto segue:Calling AddDefaultIdentity is similar to calling the following:

Per altre informazioni, vedere origine AddDefaultIdentity .See AddDefaultIdentity source for more information.

Impedisci la pubblicazione di asset di identità staticiPrevent publish of static Identity assets

Per evitare la pubblicazione di risorse di identità statiche (fogli di stile e file JavaScript per l'interfaccia utente dell'identità) nella ResolveStaticWebAssetsInputsDependsOn radice Web RemoveIdentityAssets , aggiungere la proprietà e la destinazione seguenti al file di progetto dell'app: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>

Passaggi successiviNext Steps

Autore: Rick AndersonBy Rick Anderson

ASP.NET Core identità è un sistema di appartenenza che aggiunge la funzionalità di accesso alle app ASP.NET Core.ASP.NET Core Identity is a membership system that adds login functionality to ASP.NET Core apps. Gli utenti possono creare un account con le informazioni di accesso archiviate in Identity oppure possono usare un provider di accesso esterno.Users can create an account with the login information stored in Identity or they can use an external login provider. I provider di accesso esterni supportati includono Facebook, Google, account Microsoft e Twitter.Supported external login providers include Facebook, Google, Microsoft Account, and Twitter.

L'identità può essere configurata utilizzando un database SQL Server per archiviare i nomi utente, le password e i dati di profilo.Identity can be configured using a SQL Server database to store user names, passwords, and profile data. In alternativa, è possibile usare un altro archivio permanente, ad esempio archiviazione tabelle di Azure.Alternatively, another persistent store can be used, for example, Azure Table Storage.

Consente di visualizzare o scaricare il codice di esempio (come scaricare).View or download the sample code (how to download)).

In questo argomento si apprenderà come usare l'identità per la registrazione, l'accesso e la disconnessione di un utente.In this topic, you learn how to use Identity to register, log in, and log out a user. Per istruzioni più dettagliate sulla creazione di app che usano l'identità, vedere la sezione passaggi successivi alla fine di questo articolo.For more detailed instructions about creating apps that use Identity, see the Next Steps section at the end of this article.

AddDefaultIdentity e AddIdentityAddDefaultIdentity and AddIdentity

AddDefaultIdentityè stato introdotto in ASP.NET Core 2,1.AddDefaultIdentity was introduced in ASP.NET Core 2.1. La AddDefaultIdentity chiamata a è simile alla chiamata a quanto segue:Calling AddDefaultIdentity is similar to calling the following:

Per altre informazioni, vedere origine AddDefaultIdentity .See AddDefaultIdentity source for more information.

Creare un'app Web con l'autenticazioneCreate a Web app with authentication

Creare un progetto di applicazione Web di ASP.NET Core con singoli account utente.Create an ASP.NET Core Web Application project with Individual User Accounts.

  • Selezionare file > nuovo > progetto.Select File > New > Project.
  • Selezionare Applicazione Web ASP.NET Core.Select ASP.NET Core Web Application. Denominare il progetto app Web 1 in modo che abbia lo stesso spazio dei nomi del download del progetto.Name the project WebApp1 to have the same namespace as the project download. Fare clic su OK.Click OK.
  • Selezionare un' applicazione WebASP.NET Core, quindi selezionare Modifica autenticazione.Select an ASP.NET Core Web Application, then select Change Authentication.
  • Selezionare singoli account utente e fare clic su OK.Select Individual User Accounts and click OK.

Il progetto generato fornisce ASP.NET Core identità come libreria di classi Razor.The generated project provides ASP.NET Core Identity as a Razor Class Library. La libreria della classe Razor Identity espone gli endpoint con Identity l'area.The Identity Razor Class Library exposes endpoints with the Identity area. Ad esempio:For example:

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

Applicare le migrazioniApply migrations

Applicare le migrazioni per inizializzare il database.Apply the migrations to initialize the database.

Eseguire il comando seguente nella console di gestione pacchetti (PMC):Run the following command in the Package Manager Console (PMC):

Update-Database

Registro di test e account di accessoTest Register and Login

Eseguire l'app e registrare un utente.Run the app and register a user. A seconda delle dimensioni dello schermo, potrebbe essere necessario selezionare l'interruttore di spostamento per visualizzare i collegamenti di Registro e di accesso .Depending on your screen size, you might need to select the navigation toggle button to see the Register and Login links.

Visualizzare il database di identitàView the Identity database

  • Scegliere Esplora oggetti di SQL Server (SSOX) dal menu Visualizza .From the View menu, select SQL Server Object Explorer (SSOX).
  • Passare a (local DB) MSSQLLocalDB (SQL Server 13) .Navigate to (localdb)MSSQLLocalDB(SQL Server 13). Fare clic con il pulsante destro del mouse su dbo. AspNetUsers > visualizzare i dati:Right-click on dbo.AspNetUsers > View Data:

Menu contestuale nella tabella AspNetUsers in Esplora oggetti di SQL Server

Configurare i servizi di identitàConfigure Identity services

I servizi vengono aggiunti ConfigureServicesin.Services are added in ConfigureServices. Il modello tipico consiste nel chiamare tutti i metodi Add{Service} e quindi chiamare tutti i metodi services.Configure{Service}.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);
}

Il codice precedente configura l'identità con i valori delle opzioni predefinite.The preceding code configures Identity with default option values. I servizi vengono resi disponibili per l'applicazione tramite l' inserimento di dipendenze.Services are made available to the app through dependency injection.

L'identità viene abilitata chiamando UseAuthentication.Identity is enabled by calling UseAuthentication. UseAuthenticationaggiunge il middleware di autenticazione alla pipeline della richiesta.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();
}

Per ulteriori informazioni, vedere la Classe IdentityOptions e l' avvio dell'applicazione.For more information, see the IdentityOptions Class and Application Startup.

Registrazione, accesso e disconnessione del patiboloScaffold Register, Login, and LogOut

Seguire l' identità del patibolo in un progetto Razor con le istruzioni di autorizzazione per generare il codice illustrato in questa sezione.Follow the Scaffold identity into a Razor project with authorization instructions to generate the code shown in this section.

Aggiungere i file di registro, di accesso e di disconnessione.Add the Register, Login, and LogOut files.

Esaminare il registroExamine Register

Quando un utente fa clic sul collegamento Register , RegisterModel.OnPostAsync viene richiamata l'azione.When a user clicks the Register link, the RegisterModel.OnPostAsync action is invoked. L'utente viene creato da CreateAsync sull' _userManager oggetto.The user is created by CreateAsync on the _userManager object. _userManagerviene fornito dall'inserimento delle dipendenze:_userManager is provided by dependency injection):

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

Se l'utente è stato creato correttamente, l'utente è connesso dalla chiamata a _signInManager.SignInAsync.If the user was created successfully, the user is logged in by the call to _signInManager.SignInAsync.

Nota: Vedere la conferma dell'account per i passaggi per impedire l'accesso immediato alla registrazione.Note: See account confirmation for steps to prevent immediate login at registration.

AccessoLog in

Il modulo di accesso viene visualizzato quando:The Login form is displayed when:

  • Il collegamento Accedi è selezionato.The Log in link is selected.
  • Un utente tenta di accedere a una pagina con restrizioni che non è autorizzata ad accedere o quando non è stata autenticata dal sistema.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.

Quando viene inviato il modulo nella pagina di accesso, viene OnPostAsync chiamata l'azione.When the form on the Login page is submitted, the OnPostAsync action is called. PasswordSignInAsyncviene chiamato sull' _signInManager oggetto, fornito dall'inserimento delle dipendenze.PasswordSignInAsync is called on the _signInManager object (provided by dependency injection).

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

La classe Controller base espone una User proprietà a cui è possibile accedere dai metodi del controller.The base Controller class exposes a User property that you can access from controller methods. È possibile, ad esempio, User.Claims enumerare e prendere decisioni di autorizzazione.For instance, you can enumerate User.Claims and make authorization decisions. Per altre informazioni, vedere Introduzione all'autorizzazione in ASP.NET Core.For more information, see Introduzione all'autorizzazione in ASP.NET Core.

Effettuare la disconnessioneLog out

Il collegamento Disconnetti richiama l' LogoutModel.OnPost azione.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 Cancella le attestazioni dell'utente archiviate in un cookie.SignOutAsync clears the user's claims stored in a cookie.

Post viene specificato nelle pagine/Shared/_LoginPartial. cshtml: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

I modelli di progetto Web predefiniti consentono l'accesso anonimo alle Home page.The default web project templates allow anonymous access to the home pages. Per eseguire Identityil test [Authorize] , aggiungere alla pagina privacy.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()
        {
        }
    }
}

Se è stato eseguito l'accesso, disconnettersi. Eseguire l'app e selezionare il collegamento per la privacy .If you are signed in, sign out. Run the app and select the Privacy link. Si verrà reindirizzati alla pagina di accesso.You are redirected to the login page.

EsplorareIdentityExplore Identity

Per esplorare Identity in modo più dettagliato:To explore Identity in more detail:

IdentityComponenti Components

Tutti i Identity pacchetti NuGet dipendenti sono inclusi nel metapacchetto Microsoft. AspNetCore. app.All the Identity dependent NuGet packages are included in the Microsoft.AspNetCore.App metapackage.

Il pacchetto primario per Identity è Microsoft. AspNetCore.IdentityThe primary package for Identity is Microsoft.AspNetCore.Identity. Questo pacchetto contiene il set principale di interfacce per ASP.NET Core Identityed è incluso in 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.

Migrazione a ASP.NET CoreIdentityMigrating to ASP.NET Core Identity

Per ulteriori informazioni e istruzioni sulla migrazione dell'archivio Identity esistente, vedere eseguire la migrazione Identitydell'autenticazione e .For more information and guidance on migrating your existing Identity store, see Migrate Authentication and Identity.

Impostazione della complessità della passwordSetting password strength

Vedere configurazione per un esempio che consente di impostare i requisiti minimi per le password.See Configuration for a sample that sets the minimum password requirements.

Passaggi successiviNext Steps