Présentation de l’identité sur ASP.NET CoreIntroduction to Identity on ASP.NET Core

De Rick AndersonBy Rick Anderson

ASP.NET Core identité est un système d’appartenance qui prend en charge la fonctionnalité de connexion de l’interface utilisateur.ASP.NET Core Identity is a membership system that supports user interface (UI) login functionality. Les utilisateurs peuvent créer un compte avec les informations de connexion stockées dans l’identité, ou ils peuvent utiliser un fournisseur de connexion externe.Users can create an account with the login information stored in Identity or they can use an external login provider. Les fournisseurs de connexion externes pris en charge incluent Facebook, Google, Microsoft Account et Twitter.Supported external login providers include Facebook, Google, Microsoft Account, and Twitter.

L’identité peut être configurée à l’aide d’une base de données SQL Server pour stocker les noms d’utilisateur, les mots de passe et les données de profil.Identity can be configured using a SQL Server database to store user names, passwords, and profile data. Vous pouvez également utiliser un autre magasin persistant, par exemple, le stockage table Azure.Alternatively, another persistent store can be used, for example, Azure Table Storage.

Dans cette rubrique, vous allez apprendre à utiliser l’identité pour vous inscrire, vous connecter et déconnecter un utilisateur.In this topic, you learn how to use Identity to register, log in, and log out a user. Pour obtenir des instructions plus détaillées sur la création d’applications qui utilisent l’identité, consultez la section étapes suivantes à la fin de cet article.For more detailed instructions about creating apps that use Identity, see the Next Steps section at the end of this article.

ASP.NET Core identité ajoute la fonctionnalité de connexion de l’interface utilisateur à ASP.NET Core Web Apps.ASP.NET Core Identity adds user interface (UI) login functionality to ASP.NET Core web apps. Pour sécuriser les API Web et la commande SPAs, utilisez l’une des méthodes suivantes :To secure web APIs and SPAs, use one of the following:

IdentityServer4 est un Framework OpenID Connect et OAuth 2,0 pour ASP.NET Core 3,0.IdentityServer4 is an OpenID Connect and OAuth 2.0 framework for ASP.NET Core 3.0. IdentityServer4 active les fonctionnalités de sécurité suivantes :IdentityServer4 enables the following security features:

  • Authentification en tant que service (AaaS)Authentication as a Service (AaaS)
  • Authentification unique (SSO) sur plusieurs types d’applicationsSingle sign-on/off (SSO) over multiple application types
  • Contrôle d’accès pour les APIAccess control for APIs
  • Passerelle de FédérationFederation Gateway

Pour plus d’informations, consultez Bienvenue dans IdentityServer4.For more information, see Welcome to IdentityServer4.

Affichez ou téléchargez l’exemple de code (procédure de téléchargement)).View or download the sample code (how to download)).

Créer une application Web avec l’authentificationCreate a Web app with authentication

Créez un projet d’application Web ASP.NET Core avec des comptes d’utilisateur individuels.Create an ASP.NET Core Web Application project with Individual User Accounts.

  • Sélectionnez fichier > nouveau projet>.Select File > New > Project.
  • Sélectionnez Nouvelle application web ASP.NET Core.Select ASP.NET Core Web Application. Nommez le projet application Web 1 pour avoir le même espace de noms que le projet à télécharger.Name the project WebApp1 to have the same namespace as the project download. Cliquez sur OK.Click OK.
  • Sélectionnez une application WebASP.net Core, puis sélectionnez modifier l’authentification.Select an ASP.NET Core Web Application, then select Change Authentication.
  • Sélectionnez comptes d’utilisateur individuels , puis cliquez sur OK.Select Individual User Accounts and click OK.

Le projet généré fournit une identité de ASP.net Core sous forme de bibliothèque de classes Razor.The generated project provides ASP.NET Core Identity as a Razor Class Library. La bibliothèque de classes Razor d’identité expose des points de terminaison avec la zone Identity.The Identity Razor Class Library exposes endpoints with the Identity area. Exemple :For example:

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

Appliquer des migrationsApply migrations

Appliquez les migrations pour initialiser la base de données.Apply the migrations to initialize the database.

Exécutez la commande suivante dans la console du gestionnaire de package (PMC) :Run the following command in the Package Manager Console (PMC):

PM> Update-Database

Registre de test et connexionTest Register and Login

Exécutez l’application et inscrivez un utilisateur.Run the app and register a user. Selon la taille de votre écran, vous devrez peut-être sélectionner le bouton bascule de navigation pour afficher les liens de connexion et de Registre .Depending on your screen size, you might need to select the navigation toggle button to see the Register and Login links.

Afficher la base de données d’identitéView the Identity database

  • À partir du menu Affichage, sélectionnez l’Explorateur d’objets SQL Server (SSOX).From the View menu, select SQL Server Object Explorer (SSOX).
  • Accédez à (localdb) MSSQLLocalDB (SQL Server 13) .Navigate to (localdb)MSSQLLocalDB(SQL Server 13). Cliquez avec le bouton droit sur dbo. AspNetUsers > Afficher les données :Right-click on dbo.AspNetUsers > View Data:

Menu contextuel sur la table AspNetUsers dans l’Explorateur d’objets SQL Server

Configurer les services d’identitéConfigure Identity services

Les services sont ajoutés dans ConfigureServices.Services are added in ConfigureServices. Le modèle par défaut consiste à appeler toutes les méthodes Add{Service}, puis toutes les méthodes 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;
    });
}

Le code en surbrillance précédent configure l’identité avec les valeurs d’option par défaut.The preceding highlighted code configures Identity with default option values. Les services sont mis à la disposition de l’application via l' injection de dépendances.Services are made available to the app through dependency injection.

L’identité est activée en appelant UseAuthentication.Identity is enabled by calling UseAuthentication. UseAuthentication ajoute l' intergiciel (middleware ) d’authentification au pipeline de requête.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’application générée par un modèle n’utilise pas d’autorisation.The template-generated app doesn't use authorization. app.UseAuthorization est inclus pour s’assurer qu’il est ajouté dans le bon ordre si l’application ajoute une autorisation.app.UseAuthorization is included to ensure it's added in the correct order should the app add authorization. UseRouting, UseAuthentication, UseAuthorization et UseEndpoints doivent être appelés dans l’ordre indiqué dans le code précédent.UseRouting, UseAuthentication, UseAuthorization, and UseEndpoints must be called in the order shown in the preceding code.

Pour plus d’informations sur IdentityOptions et Startup, consultez IdentityOptions et démarrage de l' application.For more information on IdentityOptions and Startup, see IdentityOptions and Application Startup.

Registre de génération de modèles, connexion et déconnexionScaffold Register, Login, and LogOut

Ajoutez les fichiers Register, login et LogOut.Add the Register, Login, and LogOut files. Suivez l' identité de l’échafaudage dans un projet Razor avec des instructions d’autorisation pour générer le code présenté dans cette section.Follow the Scaffold identity into a Razor project with authorization instructions to generate the code shown in this section.

Examiner le registreExamine Register

Quand un utilisateur clique sur le lien Register , l’action RegisterModel.OnPostAsync est appelée.When a user clicks the Register link, the RegisterModel.OnPostAsync action is invoked. L’utilisateur est créé par CreateAsync sur l’objet _userManager.The user is created by CreateAsync on the _userManager object. _userManager est fourni par l’injection de dépendances) :_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();
}

Si l’utilisateur a été créé avec succès, l’utilisateur est connecté par l’appel à _signInManager.SignInAsync.If the user was created successfully, the user is logged in by the call to _signInManager.SignInAsync.

Consultez confirmation du compte pour connaître les étapes permettant d’empêcher la connexion immédiate lors de l’inscription.See account confirmation for steps to prevent immediate login at registration.

Se connecterLog in

Le formulaire de connexion s’affiche lorsque :The Login form is displayed when:

  • Le lien connexion est sélectionné.The Log in link is selected.
  • Un utilisateur tente d’accéder à une page restreinte à laquelle il n’est pas autorisé à accéder ou lorsqu’il n’a pas été authentifié par le système.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.

Lorsque le formulaire de la page de connexion est envoyé, l’action OnPostAsync est appelée.When the form on the Login page is submitted, the OnPostAsync action is called. PasswordSignInAsync est appelé sur l’objet _signInManager (fourni par l’injection de dépendances).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 de base expose une propriété User qui est accessible à partir des méthodes de contrôleur.The base Controller class exposes a User property that can be accessed from controller methods. Par exemple, vous pouvez énumérer User.Claims et prendre des décisions d’autorisation.For instance, you can enumerate User.Claims and make authorization decisions. Pour plus d'informations, consultez Introduction aux autorisations dans ASP.NET Core.For more information, see Introduction aux autorisations dans ASP.NET Core.

Se déconnecterLog out

Le lien déconnexion appelle l’action LogoutModel.OnPost.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();
            }
        }
    }
}

Dans le code précédent, le code return RedirectToPage(); doit être une redirection afin que le navigateur exécute une nouvelle demande et que l’identité de l’utilisateur soit mise à jour.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 efface les revendications de l’utilisateur stockées dans un cookie.SignOutAsync clears the user's claims stored in a cookie.

La publication est spécifiée dans pages/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é du testTest Identity

Les modèles de projet Web par défaut autorisent l’accès anonyme aux pages d’hébergement.The default web project templates allow anonymous access to the home pages. Pour tester l’identité, ajoutez [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()
        {
        }
    }
}

Si vous êtes connecté, déconnectez-vous. Exécutez l’application et sélectionnez le lien confidentialité .If you are signed in, sign out. Run the app and select the Privacy link. Vous êtes redirigé vers la page de connexion.You are redirected to the login page.

Explorer l’identitéExplore Identity

Pour explorer l’identité plus en détail :To explore Identity in more detail:

Composants d’identitéIdentity Components

Tous les packages NuGet dépendants de l’identité sont inclus dans le ASP.net Core Framework partagé.All the Identity-dependent NuGet packages are included in the ASP.NET Core shared framework.

Le package principal pour l’identité est Microsoft. AspNetCore. Identity.The primary package for Identity is Microsoft.AspNetCore.Identity. Ce package contient l’ensemble principal d’interfaces pour ASP.NET Core identité et est inclus par 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.

Migration vers ASP.NET Core identitéMigrating to ASP.NET Core Identity

Pour plus d’informations et de conseils sur la migration de votre magasin d’identités existant, consultez migrer l’authentification et l’identité.For more information and guidance on migrating your existing Identity store, see Migrate Authentication and Identity.

Définition de la force du mot de passeSetting password strength

Consultez configuration d’un exemple qui définit la configuration minimale requise pour le mot de passe.See Configuration for a sample that sets the minimum password requirements.

AddDefaultIdentity et AddIdentityAddDefaultIdentity and AddIdentity

AddDefaultIdentity a été introduite dans ASP.NET Core 2,1.AddDefaultIdentity was introduced in ASP.NET Core 2.1. L’appel de AddDefaultIdentity est semblable à l’appel de ce qui suit :Calling AddDefaultIdentity is similar to calling the following:

Pour plus d’informations, consultez source AddDefaultIdentity .See AddDefaultIdentity source for more information.

Étapes suivantesNext Steps

De Rick AndersonBy Rick Anderson

ASP.NET Core identité est un système d’appartenance qui ajoute des fonctionnalités de connexion aux applications ASP.NET Core.ASP.NET Core Identity is a membership system that adds login functionality to ASP.NET Core apps. Les utilisateurs peuvent créer un compte avec les informations de connexion stockées dans l’identité, ou ils peuvent utiliser un fournisseur de connexion externe.Users can create an account with the login information stored in Identity or they can use an external login provider. Les fournisseurs de connexion externes pris en charge incluent Facebook, Google, Microsoft Account et Twitter.Supported external login providers include Facebook, Google, Microsoft Account, and Twitter.

L’identité peut être configurée à l’aide d’une base de données SQL Server pour stocker les noms d’utilisateur, les mots de passe et les données de profil.Identity can be configured using a SQL Server database to store user names, passwords, and profile data. Vous pouvez également utiliser un autre magasin persistant, par exemple, le stockage table Azure.Alternatively, another persistent store can be used, for example, Azure Table Storage.

Affichez ou téléchargez l’exemple de code (procédure de téléchargement)).View or download the sample code (how to download)).

Dans cette rubrique, vous allez apprendre à utiliser l’identité pour vous inscrire, vous connecter et déconnecter un utilisateur.In this topic, you learn how to use Identity to register, log in, and log out a user. Pour obtenir des instructions plus détaillées sur la création d’applications qui utilisent l’identité, consultez la section étapes suivantes à la fin de cet article.For more detailed instructions about creating apps that use Identity, see the Next Steps section at the end of this article.

AddDefaultIdentity et AddIdentityAddDefaultIdentity and AddIdentity

AddDefaultIdentity a été introduite dans ASP.NET Core 2,1.AddDefaultIdentity was introduced in ASP.NET Core 2.1. L’appel de AddDefaultIdentity est semblable à l’appel de ce qui suit :Calling AddDefaultIdentity is similar to calling the following:

Pour plus d’informations, consultez source AddDefaultIdentity .See AddDefaultIdentity source for more information.

Créer une application Web avec l’authentificationCreate a Web app with authentication

Créez un projet d’application Web ASP.NET Core avec des comptes d’utilisateur individuels.Create an ASP.NET Core Web Application project with Individual User Accounts.

  • Sélectionnez fichier > nouveau projet>.Select File > New > Project.
  • Sélectionnez Nouvelle application web ASP.NET Core.Select ASP.NET Core Web Application. Nommez le projet application Web 1 pour avoir le même espace de noms que le projet à télécharger.Name the project WebApp1 to have the same namespace as the project download. Cliquez sur OK.Click OK.
  • Sélectionnez une application WebASP.net Core, puis sélectionnez modifier l’authentification.Select an ASP.NET Core Web Application, then select Change Authentication.
  • Sélectionnez comptes d’utilisateur individuels , puis cliquez sur OK.Select Individual User Accounts and click OK.

Le projet généré fournit une identité de ASP.net Core sous forme de bibliothèque de classes Razor.The generated project provides ASP.NET Core Identity as a Razor Class Library. La bibliothèque de classes Razor d’identité expose des points de terminaison avec la zone Identity.The Identity Razor Class Library exposes endpoints with the Identity area. Exemple :For example:

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

Appliquer des migrationsApply migrations

Appliquez les migrations pour initialiser la base de données.Apply the migrations to initialize the database.

Exécutez la commande suivante dans la console du gestionnaire de package (PMC) :Run the following command in the Package Manager Console (PMC):

PM> Update-Database

Registre de test et connexionTest Register and Login

Exécutez l’application et inscrivez un utilisateur.Run the app and register a user. Selon la taille de votre écran, vous devrez peut-être sélectionner le bouton bascule de navigation pour afficher les liens de connexion et de Registre .Depending on your screen size, you might need to select the navigation toggle button to see the Register and Login links.

Afficher la base de données d’identitéView the Identity database

  • À partir du menu Affichage, sélectionnez l’Explorateur d’objets SQL Server (SSOX).From the View menu, select SQL Server Object Explorer (SSOX).
  • Accédez à (localdb) MSSQLLocalDB (SQL Server 13) .Navigate to (localdb)MSSQLLocalDB(SQL Server 13). Cliquez avec le bouton droit sur dbo. AspNetUsers > Afficher les données :Right-click on dbo.AspNetUsers > View Data:

Menu contextuel sur la table AspNetUsers dans l’Explorateur d’objets SQL Server

Configurer les services d’identitéConfigure Identity services

Les services sont ajoutés dans ConfigureServices.Services are added in ConfigureServices. Le modèle par défaut consiste à appeler toutes les méthodes Add{Service}, puis toutes les méthodes 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);
}

Le code précédent configure l’identité avec les valeurs d’option par défaut.The preceding code configures Identity with default option values. Les services sont mis à la disposition de l’application via l' injection de dépendances.Services are made available to the app through dependency injection.

L’identité est activée en appelant UseAuthentication.Identity is enabled by calling UseAuthentication. UseAuthentication ajoute l' intergiciel (middleware ) d’authentification au pipeline de requête.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();
}

Pour plus d’informations, consultez la classe IdentityOptions et le démarrage de l' application.For more information, see the IdentityOptions Class and Application Startup.

Registre de génération de modèles, connexion et déconnexionScaffold Register, Login, and LogOut

Suivez l' identité de l’échafaudage dans un projet Razor avec des instructions d’autorisation pour générer le code présenté dans cette section.Follow the Scaffold identity into a Razor project with authorization instructions to generate the code shown in this section.

Ajoutez les fichiers Register, login et LogOut.Add the Register, Login, and LogOut files.

Examiner le registreExamine Register

Quand un utilisateur clique sur le lien Register , l’action RegisterModel.OnPostAsync est appelée.When a user clicks the Register link, the RegisterModel.OnPostAsync action is invoked. L’utilisateur est créé par CreateAsync sur l’objet _userManager.The user is created by CreateAsync on the _userManager object. _userManager est fourni par l’injection de dépendances) :_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();
}

Si l’utilisateur a été créé avec succès, l’utilisateur est connecté par l’appel à _signInManager.SignInAsync.If the user was created successfully, the user is logged in by the call to _signInManager.SignInAsync.

Remarque : Consultez confirmation du compte pour connaître les étapes permettant d’empêcher la connexion immédiate lors de l’inscription.Note: See account confirmation for steps to prevent immediate login at registration.

Se connecterLog in

Le formulaire de connexion s’affiche lorsque :The Login form is displayed when:

  • Le lien connexion est sélectionné.The Log in link is selected.
  • Un utilisateur tente d’accéder à une page restreinte à laquelle il n’est pas autorisé à accéder ou lorsqu’il n’a pas été authentifié par le système.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.

Lorsque le formulaire de la page de connexion est envoyé, l’action OnPostAsync est appelée.When the form on the Login page is submitted, the OnPostAsync action is called. PasswordSignInAsync est appelé sur l’objet _signInManager (fourni par l’injection de dépendances).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 de base expose une propriété User à laquelle vous pouvez accéder à partir des méthodes de contrôleur.The base Controller class exposes a User property that you can access from controller methods. Par exemple, vous pouvez énumérer User.Claims et prendre des décisions d’autorisation.For instance, you can enumerate User.Claims and make authorization decisions. Pour plus d'informations, consultez Introduction aux autorisations dans ASP.NET Core.For more information, see Introduction aux autorisations dans ASP.NET Core.

Se déconnecterLog out

Le lien déconnexion appelle l’action LogoutModel.OnPost.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 efface les revendications de l’utilisateur stockées dans un cookie.SignOutAsync clears the user's claims stored in a cookie.

La publication est spécifiée dans pages/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é du testTest Identity

Les modèles de projet Web par défaut autorisent l’accès anonyme aux pages d’hébergement.The default web project templates allow anonymous access to the home pages. Pour tester l’identité, ajoutez [Authorize] à la page de confidentialité.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()
        {
        }
    }
}

Si vous êtes connecté, déconnectez-vous. Exécutez l’application et sélectionnez le lien confidentialité .If you are signed in, sign out. Run the app and select the Privacy link. Vous êtes redirigé vers la page de connexion.You are redirected to the login page.

Explorer l’identitéExplore Identity

Pour explorer l’identité plus en détail :To explore Identity in more detail:

Composants d’identitéIdentity Components

Tous les packages NuGet dépendants de l’identité sont inclus dans le sous- package Microsoft. AspNetCore. app.All the Identity dependent NuGet packages are included in the Microsoft.AspNetCore.App metapackage.

Le package principal pour l’identité est Microsoft. AspNetCore. Identity.The primary package for Identity is Microsoft.AspNetCore.Identity. Ce package contient l’ensemble principal d’interfaces pour ASP.NET Core identité et est inclus par 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.

Migration vers ASP.NET Core identitéMigrating to ASP.NET Core Identity

Pour plus d’informations et de conseils sur la migration de votre magasin d’identités existant, consultez migrer l’authentification et l’identité.For more information and guidance on migrating your existing Identity store, see Migrate Authentication and Identity.

Définition de la force du mot de passeSetting password strength

Consultez configuration d’un exemple qui définit la configuration minimale requise pour le mot de passe.See Configuration for a sample that sets the minimum password requirements.

Étapes suivantesNext Steps