Générer automatiquement des modèles d’Identity dans les projets ASP.NET Core

Par Rick Anderson

ASP.NET Core fournit ASP.NET Core Identity en tant que bibliothèque de classes Razor. Les applications qui incluent Identity peuvent appliquer le générateur de modèles automatique de manière sélective pour ajouter le code source contenu dans la bibliothèque de classes d’IdentityRazor (RCL). Vous pouvez souhaiter générer le code source afin de pouvoir modifier le code et changer le comportement. Par exemple, vous pouvez demander au générateur de modèles automatique de générer le code utilisé dans l’inscription. Le code généré est prioritaire sur le même code dans la bibliothèque de classes Identityd’identité. Pour obtenir le contrôle total de l’interface utilisateur et ne pas utiliser la RCL par défaut, consultez la section Créer une source d’interface utilisateur d’Identity complète.

Les applications qui n’incluent pas l’authentification peuvent appliquer le générateur de modèles automatique pour ajouter le package RCL d’Identity. Vous pouvez sélectionner le code de Identity à générer.

Bien que le générateur de modèles génère la majeure partie du code nécessaire, vous devez mettre à jour votre projet pour terminer le processus. Ce document explique les étapes nécessaires pour effectuer une mise à jour de la génération de modèles d’Identity automatique.

Nous vous recommandons d’utiliser un système de contrôle de code source qui affiche les différences de fichiers et vous permet de revenir sur les modifications. Examinez les modifications après avoir exécuté le générateur de modèles d’Identity.

Des services sont requis lors de l’utilisation de l’authentification à deux facteurs, de la confirmation de compte et de la récupération de mot de passe, ainsi que d’autres fonctionnalités de sécurité avec Identity. Les services ou les stubs de service ne sont pas générés lors de la génération de modèles d’Identity automatique. Les services permettant d’activer ces fonctionnalités doivent être ajoutés manuellement. Par exemple, consultez Exiger un e-mail de confirmation.

En règle générale, les applications qui ont été créées avec des comptes individuels ne doivent pas créer un nouveau contexte de données.

Générer un modèle d’Identity dans un projet Razor sans autorisation existante

Installez le package NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Notes

Pour obtenir des conseils sur l’ajout de packages à des applications .NET, consultez les articles figurant sous Installer et gérer des packages dans Flux de travail de la consommation des packages (documentation NuGet). Vérifiez les versions du package sur NuGet.org.


Exécutez le générateur de modèles d’Identity automatique :

  • À partir de l’Explorateur de solutions, cliquez avec le bouton droit sur le projet >Ajouter>Nouvel élément de modèle généré automatiquement.
  • Dans le volet gauche de la boîte de dialogue Ajouter un nouvel élément généré automatiquement, sélectionnez Identity. Sélectionnez Identity dans le volet central. Sélectionnez le bouton Ajouter.
  • Dans la boîte de dialogue Ajouter Identity, sélectionnez les options souhaitées.
    • Si vous disposez d’une page de disposition personnalisée pour Identity (_Layout.cshtml), sélectionnez votre page de disposition existante pour éviter de remplacer votre mise en page avec un balisage incorrect du générateur de modèles automatique. Par exemple, sélectionnez :
      • Pages/Shared/_Layout.cshtml pour les projets Razor Pages ou Blazor Server avec l’infrastructure Razor Pages existante.
      • Views/Shared/_Layout.cshtml pour les projets MVC ou les projets Blazor Server avec une infrastructure MVC existante.
    • Pour le contexte de données (classe DbContext) :
      • Sélectionnez votre classe de contexte de données. Vous devez sélectionner au moins un fichier pour ajouter votre contexte de données.
      • Pour créer un contexte de données et éventuellement créer une classe d’utilisateur pour Identity, sélectionnez le bouton +. Acceptez la valeur par défaut ou spécifiez une classe (par exemple, Contoso.Data.ApplicationDbContext pour une société nommée « Contoso »). Pour créer une classe d’utilisateur, sélectionnez le bouton + pour la classe Utilisateur et spécifiez la classe (par exemple, ContosoUser pour une société nommée « Contoso »).
    • Sélectionnez le bouton Ajouter pour exécuter le générateur de modèles automatique.

Migrations, UseAuthentication et disposition

Le code de base de données d’Identity généré nécessite des migrations Entity Framework Core. Si une migration pour créer le schéma d’Identity n’a pas été créée et appliquée à la base de données, créez une migration et mettez à jour la base de données. Par exemple, exécutez les commandes suivantes :

Dans la console du Gestionnaire de packageVisual Studio :

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

Le paramètre de nom « CreateIdentitySchema » pour la commande Add-Migration est arbitraire. "CreateIdentitySchema" décrit la migration.

Si le schéma d’Identity a déjà été créé mais n’a pas été appliqué à la base de données, seule la commande de mise à jour de la base de données doit être exécutée :

Dans la console du Gestionnaire de package Visual Studio Update-Database:

Update-Database

Vous pouvez confirmer l’application d’un schéma d’Identity avec la commande suivante. La sortie de la commande inclut une colonne « applied » pour afficher les migrations appliquées à la base de données.

Dans la console du Gestionnaire de package Visual Studio, exécutez Get-Migration:

Get-Migration

S’il existe plusieurs contextes de base de données, spécifiez le contexte avec le paramètre -Context.

Modifications de disposition

Facultatif : ajoutez la connexion partielle (_LoginPartial) au fichier de disposition :

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - WebRPnoAuth2Auth</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
    <link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
    <link rel="stylesheet" href="~/WebRPnoAuth2Auth.styles.css" asp-append-version="true" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">WebRPnoAuth2Auth</a>
                <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                        </li>
                    </ul>
                    <partial name="_LoginPartial" />
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2021 - WebRPnoAuth2Auth - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

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

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

Générer un modèle d’Identity dans un projet Razor avec autorisation

Installez le package NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Notes

Pour obtenir des conseils sur l’ajout de packages à des applications .NET, consultez les articles figurant sous Installer et gérer des packages dans Flux de travail de la consommation des packages (documentation NuGet). Vérifiez les versions du package sur NuGet.org.


Exécutez le générateur de modèles d’Identity automatique :

  • À partir de l’Explorateur de solutions, cliquez avec le bouton droit sur le projet >Ajouter>Nouvel élément de modèle généré automatiquement.
  • Dans le volet gauche de la boîte de dialogue Ajouter un nouvel élément généré automatiquement, sélectionnez Identity. Sélectionnez Identity dans le volet central. Sélectionnez le bouton Ajouter.
  • Dans la boîte de dialogue Ajouter Identity, sélectionnez les options souhaitées.
    • Si vous disposez d’une page de disposition personnalisée pour Identity (_Layout.cshtml), sélectionnez votre page de disposition existante pour éviter de remplacer votre mise en page avec un balisage incorrect du générateur de modèles automatique. Par exemple, sélectionnez :
      • Pages/Shared/_Layout.cshtml pour les projets Razor Pages ou Blazor Server avec l’infrastructure Razor Pages existante.
      • Views/Shared/_Layout.cshtml pour les projets MVC ou les projets Blazor Server avec une infrastructure MVC existante.
    • Pour le contexte de données (classe DbContext) :
      • Sélectionnez votre classe de contexte de données. Vous devez sélectionner au moins un fichier pour ajouter votre contexte de données.
      • Pour créer un contexte de données et éventuellement créer une classe d’utilisateur pour Identity, sélectionnez le bouton +. Acceptez la valeur par défaut ou spécifiez une classe (par exemple, Contoso.Data.ApplicationDbContext pour une société nommée « Contoso »). Pour créer une classe d’utilisateur, sélectionnez le bouton + pour la classe Utilisateur et spécifiez la classe (par exemple, ContosoUser pour une société nommée « Contoso »).
    • Sélectionnez le bouton Ajouter pour exécuter le générateur de modèles automatique.

Générer un modèle d’Identity dans un projet MVC sans autorisation existante

Installez le package NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Notes

Pour obtenir des conseils sur l’ajout de packages à des applications .NET, consultez les articles figurant sous Installer et gérer des packages dans Flux de travail de la consommation des packages (documentation NuGet). Vérifiez les versions du package sur NuGet.org.


Exécutez le générateur de modèles d’Identity automatique :

  • À partir de l’Explorateur de solutions, cliquez avec le bouton droit sur le projet >Ajouter>Nouvel élément de modèle généré automatiquement.
  • Dans le volet gauche de la boîte de dialogue Ajouter un nouvel élément généré automatiquement, sélectionnez Identity. Sélectionnez Identity dans le volet central. Sélectionnez le bouton Ajouter.
  • Dans la boîte de dialogue Ajouter Identity, sélectionnez les options souhaitées.
    • Si vous disposez d’une page de disposition personnalisée pour Identity (_Layout.cshtml), sélectionnez votre page de disposition existante pour éviter de remplacer votre mise en page avec un balisage incorrect du générateur de modèles automatique. Par exemple, sélectionnez :
      • Pages/Shared/_Layout.cshtml pour les projets Razor Pages ou Blazor Server avec l’infrastructure Razor Pages existante.
      • Views/Shared/_Layout.cshtml pour les projets MVC ou les projets Blazor Server avec une infrastructure MVC existante.
    • Pour le contexte de données (classe DbContext) :
      • Sélectionnez votre classe de contexte de données. Vous devez sélectionner au moins un fichier pour ajouter votre contexte de données.
      • Pour créer un contexte de données et éventuellement créer une classe d’utilisateur pour Identity, sélectionnez le bouton +. Acceptez la valeur par défaut ou spécifiez une classe (par exemple, Contoso.Data.ApplicationDbContext pour une société nommée « Contoso »). Pour créer une classe d’utilisateur, sélectionnez le bouton + pour la classe Utilisateur et spécifiez la classe (par exemple, ContosoUser pour une société nommée « Contoso »).
    • Sélectionnez le bouton Ajouter pour exécuter le générateur de modèles automatique.

Facultatif : ajoutez la connexion partielle (_LoginPartial) au fichier Views/Shared/_Layout.cshtml :

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - WebRPnoAuth2Auth</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
    <link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
    <link rel="stylesheet" href="~/WebRPnoAuth2Auth.styles.css" asp-append-version="true" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">WebRPnoAuth2Auth</a>
                <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                        </li>
                    </ul>
                    <partial name="_LoginPartial" />
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2021 - WebRPnoAuth2Auth - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

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

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

Le code de base de données d’Identity généré nécessite des migrations Entity Framework Core. Si une migration pour créer le schéma d’Identity n’a pas été créée et appliquée à la base de données, créez une migration et mettez à jour la base de données. Par exemple, exécutez les commandes suivantes :

Dans la console du Gestionnaire de packageVisual Studio :

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

Le paramètre de nom « CreateIdentitySchema » pour la commande Add-Migration est arbitraire. "CreateIdentitySchema" décrit la migration.

Si le schéma d’Identity a déjà été créé mais n’a pas été appliqué à la base de données, seule la commande de mise à jour de la base de données doit être exécutée :

Dans la console du Gestionnaire de package Visual Studio Update-Database:

Update-Database

Vous pouvez confirmer l’application d’un schéma d’Identity avec la commande suivante. La sortie de la commande inclut une colonne « applied » pour afficher les migrations appliquées à la base de données.

Dans la console du Gestionnaire de package Visual Studio, exécutez Get-Migration:

Get-Migration

S’il existe plusieurs contextes de base de données, spécifiez le contexte avec le paramètre -Context.

Ajoutez MapRazorPages à Program.cs, comme indiqué dans le code en surbrillance suivant :

using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebMVCauth.Data;

var builder = WebApplication.CreateBuilder(args);

var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();

builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddControllersWithViews();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseMigrationsEndPoint();
}
else
{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapRazorPages();

app.Run();

Générer un modèle d’Identity dans un projet MVC avec autorisation

Installez le package NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Notes

Pour obtenir des conseils sur l’ajout de packages à des applications .NET, consultez les articles figurant sous Installer et gérer des packages dans Flux de travail de la consommation des packages (documentation NuGet). Vérifiez les versions du package sur NuGet.org.


Exécutez le générateur de modèles d’Identity automatique :

  • À partir de l’Explorateur de solutions, cliquez avec le bouton droit sur le projet >Ajouter>Nouvel élément de modèle généré automatiquement.
  • Dans le volet gauche de la boîte de dialogue Ajouter un nouvel élément généré automatiquement, sélectionnez Identity. Sélectionnez Identity dans le volet central. Sélectionnez le bouton Ajouter.
  • Dans la boîte de dialogue Ajouter Identity, sélectionnez les options souhaitées.
    • Si vous disposez d’une page de disposition personnalisée pour Identity (_Layout.cshtml), sélectionnez votre page de disposition existante pour éviter de remplacer votre mise en page avec un balisage incorrect du générateur de modèles automatique. Par exemple, sélectionnez :
      • Pages/Shared/_Layout.cshtml pour les projets Razor Pages ou Blazor Server avec l’infrastructure Razor Pages existante.
      • Views/Shared/_Layout.cshtml pour les projets MVC ou les projets Blazor Server avec une infrastructure MVC existante.
    • Pour le contexte de données (classe DbContext) :
      • Sélectionnez votre classe de contexte de données. Vous devez sélectionner au moins un fichier pour ajouter votre contexte de données.
      • Pour créer un contexte de données et éventuellement créer une classe d’utilisateur pour Identity, sélectionnez le bouton +. Acceptez la valeur par défaut ou spécifiez une classe (par exemple, Contoso.Data.ApplicationDbContext pour une société nommée « Contoso »). Pour créer une classe d’utilisateur, sélectionnez le bouton + pour la classe Utilisateur et spécifiez la classe (par exemple, ContosoUser pour une société nommée « Contoso »).
    • Sélectionnez le bouton Ajouter pour exécuter le générateur de modèles automatique.

Applications Blazor côté client

Les applications Blazor côté client utilisent leurs propres approches d’interface utilisateur d’Identity et ne peuvent pas utiliser la génération de modèles d’Identity automatique d’ASP.NET Core. Les applications ASP.NET Core côté serveur de solutions Blazor hébergées peuvent suivre les instructions Razor Pages/MVC de cet article et sont configurées comme n’importe quel autre type d’application ASP.NET Core qui prend en charge Identity.

L’infrastructure Blazor n’inclut pas les versions des composants Razor des pages de l’interface utilisateur d’Identity. Les composants de l’interface utilisateur d’IdentityRazor peuvent être générés sur mesure ou obtenus à partir de sources tierces non prises en charge.

Pour plus d’informations, consultez les articles Sécurité Blazor et Identity.

Créer une source d’interface utilisateur d’Identity complète

Pour conserver un contrôle total de l’interface utilisateur d’Identity, exécutez le générateur de modèles d’Identity automatique et sélectionnez Remplacer tous les fichiers.

Configuration du mot de passe

Si PasswordOptions est configuré dans Startup.ConfigureServices, la configuration de l’attribut [StringLength] peut être requise pour la propriété Password dans les pages d’Identity générées automatiquement. Les propriétés InputModelPassword se trouvent dans les fichiers suivants :

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

Désactiver une page

Cette section montre comment désactiver la page d’inscription, mais l’approche peut être utilisée pour désactiver n’importe quelle page.

Pour désactiver l’inscription utilisateur :

  • Générez automatiquement des modèles d’Identity. Incluez Account.Register, Account.Login et Account.RegisterConfirmation. Par exemple :

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  • Mettez à jour Areas/Identity/Pages/Account/Register.cshtml.cs pour que les utilisateurs ne puissent pas s’inscrire à partir de ce point de terminaison :

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • Mettez à jour Areas/Identity/Pages/Account/Register.cshtml pour être cohérent avec les modifications précédentes :

    @page
    @model RegisterModel
    @{
        ViewData["Title"] = "Go to Login";
    }
    
    <h1>@ViewData["Title"]</h1>
    
    <li class="nav-item">
        <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
    </li>
    
  • Mettez en commentaires ou supprimez le lien d’inscription à partir de Areas/Identity/Pages/Account/Login.cshtml

    @*
    <p>
        <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
    </p>
    *@
    
  • Mettez à jour la page Areas/Identity/Pages/Account/RegisterConfirmation.

    • Supprimez le code et les liens du fichier cshtml.
    • Supprimez le code de confirmation du PageModel :
    [AllowAnonymous]
      public class RegisterConfirmationModel : PageModel
      {
          public IActionResult OnGet()
          {  
              return Page();
          }
      }
    

Utiliser une autre application pour ajouter des utilisateurs

Fournissez un mécanisme pour ajouter des utilisateurs en dehors de l’application web. Les options d’ajout d’utilisateurs sont les suivantes :

  • Une application web d’administration dédiée.
  • Une application console.

Le code suivant décrit une approche pour ajouter des utilisateurs :

  • Une liste d’utilisateurs est lue en mémoire.
  • Un mot de passe unique fort est généré pour chaque utilisateur.
  • L’utilisateur est ajouté à la base de données d’Identity.
  • L’utilisateur est averti et invité à modifier le mot de passe.
public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();

        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;

            try
            {
                var context = services.GetRequiredService<AppDbCntx>();
                context.Database.Migrate();

                var config = host.Services.GetRequiredService<IConfiguration>();
                var userList = config.GetSection("userList").Get<List<string>>();

                SeedData.Initialize(services, userList).Wait();
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occurred adding users.");
            }
        }

        host.Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

Le code suivant décrit l’ajout d’un utilisateur :


public static async Task Initialize(IServiceProvider serviceProvider,
                                    List<string> userList)
{
    var userManager = serviceProvider.GetService<UserManager<IdentityUser>>();

    foreach (var userName in userList)
    {
        var userPassword = GenerateSecurePassword();
        var userId = await EnsureUser(userManager, userName, userPassword);

        NotifyUser(userName, userPassword);
    }
}

private static async Task<string> EnsureUser(UserManager<IdentityUser> userManager,
                                             string userName, string userPassword)
{
    var user = await userManager.FindByNameAsync(userName);

    if (user == null)
    {
        user = new IdentityUser(userName)
        {
            EmailConfirmed = true
        };
        await userManager.CreateAsync(user, userPassword);
    }

    return user.Id;
}

Une approche similaire peut être suivie pour les scénarios de production.

Empêcher la publication de ressources statiques d’Identity

Pour empêcher la publication de ressources statiques d’Identity sur la racine web, consultez Présentation d’Identity sur ASP.NET Core.

ASP.NET Core fournit ASP.NET Core Identity en tant que bibliothèque de classes Razor. Les applications qui incluent Identity peuvent appliquer le générateur de modèles automatique de manière sélective pour ajouter le code source contenu dans la bibliothèque de classes d’IdentityRazor (RCL). Vous pouvez souhaiter générer le code source afin de pouvoir modifier le code et changer le comportement. Par exemple, vous pouvez demander au générateur de modèles automatique de générer le code utilisé dans l’inscription. Le code généré est prioritaire sur le même code dans la bibliothèque de classes Identityd’identité. Pour obtenir le contrôle total de l’interface utilisateur et ne pas utiliser la RCL par défaut, consultez la section Créer une source d’interface utilisateur d’Identity complète.

Les applications qui n’incluent pas l’authentification peuvent appliquer le générateur de modèles automatique pour ajouter le package RCL d’Identity. Vous pouvez sélectionner le code de Identity à générer.

Bien que le générateur de modèles génère la majeure partie du code nécessaire, vous devez mettre à jour votre projet pour terminer le processus. Ce document explique les étapes nécessaires pour effectuer une mise à jour de la génération de modèles d’Identity automatique.

Nous vous recommandons d’utiliser un système de contrôle de code source qui affiche les différences de fichiers et vous permet de revenir sur les modifications. Examinez les modifications après avoir exécuté le générateur de modèles d’Identity.

Des services sont requis lors de l’utilisation de l’authentification à deux facteurs, de la confirmation de compte et de la récupération de mot de passe, ainsi que d’autres fonctionnalités de sécurité avec Identity. Les services ou les stubs de service ne sont pas générés lors de la génération de modèles d’Identity automatique. Les services permettant d’activer ces fonctionnalités doivent être ajoutés manuellement. Par exemple, consultez Exiger un e-mail de confirmation.

En règle générale, les applications qui ont été créées avec des comptes individuels ne doivent pas créer un nouveau contexte de données.

Générer un modèle d’Identity dans un projet Razor sans autorisation existante

Installez le package NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Notes

Pour obtenir des conseils sur l’ajout de packages à des applications .NET, consultez les articles figurant sous Installer et gérer des packages dans Flux de travail de la consommation des packages (documentation NuGet). Vérifiez les versions du package sur NuGet.org.


Exécutez le générateur de modèles d’Identity automatique :

  • À partir de l’Explorateur de solutions, cliquez avec le bouton droit sur le projet >Ajouter>Nouvel élément de modèle généré automatiquement.
  • Dans le volet gauche de la boîte de dialogue Ajouter un nouvel élément généré automatiquement, sélectionnez Identity. Sélectionnez Identity dans le volet central. Sélectionnez le bouton Ajouter.
  • Dans la boîte de dialogue Ajouter Identity, sélectionnez les options souhaitées.
    • Si vous disposez d’une page de disposition personnalisée pour Identity (_Layout.cshtml), sélectionnez votre page de disposition existante pour éviter de remplacer votre mise en page avec un balisage incorrect du générateur de modèles automatique. Par exemple, sélectionnez :
      • Pages/Shared/_Layout.cshtml pour les projets Razor Pages ou Blazor Server avec l’infrastructure Razor Pages existante.
      • Views/Shared/_Layout.cshtml pour les projets MVC ou les projets Blazor Server avec une infrastructure MVC existante.
    • Pour le contexte de données (classe DbContext) :
      • Sélectionnez votre classe de contexte de données. Vous devez sélectionner au moins un fichier pour ajouter votre contexte de données.
      • Pour créer un contexte de données et éventuellement créer une classe d’utilisateur pour Identity, sélectionnez le bouton +. Acceptez la valeur par défaut ou spécifiez une classe (par exemple, Contoso.Data.ApplicationDbContext pour une société nommée « Contoso »). Pour créer une classe d’utilisateur, sélectionnez le bouton + pour la classe Utilisateur et spécifiez la classe (par exemple, ContosoUser pour une société nommée « Contoso »).
    • Sélectionnez le bouton Ajouter pour exécuter le générateur de modèles automatique.

Migrations, UseAuthentication et disposition

Le code de base de données d’Identity généré nécessite des migrations Entity Framework Core. Si une migration pour créer le schéma d’Identity n’a pas été créée et appliquée à la base de données, créez une migration et mettez à jour la base de données. Par exemple, exécutez les commandes suivantes :

Dans la console du Gestionnaire de packageVisual Studio :

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

Le paramètre de nom « CreateIdentitySchema » pour la commande Add-Migration est arbitraire. "CreateIdentitySchema" décrit la migration.

Si le schéma d’Identity a déjà été créé mais n’a pas été appliqué à la base de données, seule la commande de mise à jour de la base de données doit être exécutée :

Dans la console du Gestionnaire de package Visual Studio Update-Database:

Update-Database

Vous pouvez confirmer l’application d’un schéma d’Identity avec la commande suivante. La sortie de la commande inclut une colonne « applied » pour afficher les migrations appliquées à la base de données.

Dans la console du Gestionnaire de package Visual Studio, exécutez Get-Migration:

Get-Migration

S’il existe plusieurs contextes de base de données, spécifiez le contexte avec le paramètre -Context.

Modifications de disposition

Facultatif : ajoutez la connexion partielle (_LoginPartial) au fichier de disposition :

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - WebRPnoAuth2Auth</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
    <link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
    <link rel="stylesheet" href="~/WebRPnoAuth2Auth.styles.css" asp-append-version="true" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">WebRPnoAuth2Auth</a>
                <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                        </li>
                    </ul>
                    <partial name="_LoginPartial" />
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2021 - WebRPnoAuth2Auth - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

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

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

Générer un modèle d’Identity dans un projet Razor avec autorisation

Installez le package NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Notes

Pour obtenir des conseils sur l’ajout de packages à des applications .NET, consultez les articles figurant sous Installer et gérer des packages dans Flux de travail de la consommation des packages (documentation NuGet). Vérifiez les versions du package sur NuGet.org.


Exécutez le générateur de modèles d’Identity automatique :

  • À partir de l’Explorateur de solutions, cliquez avec le bouton droit sur le projet >Ajouter>Nouvel élément de modèle généré automatiquement.
  • Dans le volet gauche de la boîte de dialogue Ajouter un nouvel élément généré automatiquement, sélectionnez Identity. Sélectionnez Identity dans le volet central. Sélectionnez le bouton Ajouter.
  • Dans la boîte de dialogue Ajouter Identity, sélectionnez les options souhaitées.
    • Si vous disposez d’une page de disposition personnalisée pour Identity (_Layout.cshtml), sélectionnez votre page de disposition existante pour éviter de remplacer votre mise en page avec un balisage incorrect du générateur de modèles automatique. Par exemple, sélectionnez :
      • Pages/Shared/_Layout.cshtml pour les projets Razor Pages ou Blazor Server avec l’infrastructure Razor Pages existante.
      • Views/Shared/_Layout.cshtml pour les projets MVC ou les projets Blazor Server avec une infrastructure MVC existante.
    • Pour le contexte de données (classe DbContext) :
      • Sélectionnez votre classe de contexte de données. Vous devez sélectionner au moins un fichier pour ajouter votre contexte de données.
      • Pour créer un contexte de données et éventuellement créer une classe d’utilisateur pour Identity, sélectionnez le bouton +. Acceptez la valeur par défaut ou spécifiez une classe (par exemple, Contoso.Data.ApplicationDbContext pour une société nommée « Contoso »). Pour créer une classe d’utilisateur, sélectionnez le bouton + pour la classe Utilisateur et spécifiez la classe (par exemple, ContosoUser pour une société nommée « Contoso »).
    • Sélectionnez le bouton Ajouter pour exécuter le générateur de modèles automatique.

Générer un modèle d’Identity dans un projet MVC sans autorisation existante

Installez le package NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Notes

Pour obtenir des conseils sur l’ajout de packages à des applications .NET, consultez les articles figurant sous Installer et gérer des packages dans Flux de travail de la consommation des packages (documentation NuGet). Vérifiez les versions du package sur NuGet.org.


Exécutez le générateur de modèles d’Identity automatique :

  • À partir de l’Explorateur de solutions, cliquez avec le bouton droit sur le projet >Ajouter>Nouvel élément de modèle généré automatiquement.
  • Dans le volet gauche de la boîte de dialogue Ajouter un nouvel élément généré automatiquement, sélectionnez Identity. Sélectionnez Identity dans le volet central. Sélectionnez le bouton Ajouter.
  • Dans la boîte de dialogue Ajouter Identity, sélectionnez les options souhaitées.
    • Si vous disposez d’une page de disposition personnalisée pour Identity (_Layout.cshtml), sélectionnez votre page de disposition existante pour éviter de remplacer votre mise en page avec un balisage incorrect du générateur de modèles automatique. Par exemple, sélectionnez :
      • Pages/Shared/_Layout.cshtml pour les projets Razor Pages ou Blazor Server avec l’infrastructure Razor Pages existante.
      • Views/Shared/_Layout.cshtml pour les projets MVC ou les projets Blazor Server avec une infrastructure MVC existante.
    • Pour le contexte de données (classe DbContext) :
      • Sélectionnez votre classe de contexte de données. Vous devez sélectionner au moins un fichier pour ajouter votre contexte de données.
      • Pour créer un contexte de données et éventuellement créer une classe d’utilisateur pour Identity, sélectionnez le bouton +. Acceptez la valeur par défaut ou spécifiez une classe (par exemple, Contoso.Data.ApplicationDbContext pour une société nommée « Contoso »). Pour créer une classe d’utilisateur, sélectionnez le bouton + pour la classe Utilisateur et spécifiez la classe (par exemple, ContosoUser pour une société nommée « Contoso »).
    • Sélectionnez le bouton Ajouter pour exécuter le générateur de modèles automatique.

Facultatif : ajoutez la connexion partielle (_LoginPartial) au fichier Views/Shared/_Layout.cshtml :

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - WebRPnoAuth2Auth</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
    <link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
    <link rel="stylesheet" href="~/WebRPnoAuth2Auth.styles.css" asp-append-version="true" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">WebRPnoAuth2Auth</a>
                <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                        </li>
                    </ul>
                    <partial name="_LoginPartial" />
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2021 - WebRPnoAuth2Auth - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

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

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

Le code de base de données d’Identity généré nécessite des migrations Entity Framework Core. Si une migration pour créer le schéma d’Identity n’a pas été créée et appliquée à la base de données, créez une migration et mettez à jour la base de données. Par exemple, exécutez les commandes suivantes :

Dans la console du Gestionnaire de packageVisual Studio :

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

Le paramètre de nom « CreateIdentitySchema » pour la commande Add-Migration est arbitraire. "CreateIdentitySchema" décrit la migration.

Si le schéma d’Identity a déjà été créé mais n’a pas été appliqué à la base de données, seule la commande de mise à jour de la base de données doit être exécutée :

Dans la console du Gestionnaire de package Visual Studio Update-Database:

Update-Database

Vous pouvez confirmer l’application d’un schéma d’Identity avec la commande suivante. La sortie de la commande inclut une colonne « applied » pour afficher les migrations appliquées à la base de données.

Dans la console du Gestionnaire de package Visual Studio, exécutez Get-Migration:

Get-Migration

S’il existe plusieurs contextes de base de données, spécifiez le contexte avec le paramètre -Context.

Ajoutez MapRazorPages à Program.cs, comme indiqué dans le code en surbrillance suivant :

using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebMVCauth.Data;

var builder = WebApplication.CreateBuilder(args);

var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();

builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddControllersWithViews();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseMigrationsEndPoint();
}
else
{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapRazorPages();

app.Run();

Générer un modèle d’Identity dans un projet MVC avec autorisation

Installez le package NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Notes

Pour obtenir des conseils sur l’ajout de packages à des applications .NET, consultez les articles figurant sous Installer et gérer des packages dans Flux de travail de la consommation des packages (documentation NuGet). Vérifiez les versions du package sur NuGet.org.


Exécutez le générateur de modèles d’Identity automatique :

  • À partir de l’Explorateur de solutions, cliquez avec le bouton droit sur le projet >Ajouter>Nouvel élément de modèle généré automatiquement.
  • Dans le volet gauche de la boîte de dialogue Ajouter un nouvel élément généré automatiquement, sélectionnez Identity. Sélectionnez Identity dans le volet central. Sélectionnez le bouton Ajouter.
  • Dans la boîte de dialogue Ajouter Identity, sélectionnez les options souhaitées.
    • Si vous disposez d’une page de disposition personnalisée pour Identity (_Layout.cshtml), sélectionnez votre page de disposition existante pour éviter de remplacer votre mise en page avec un balisage incorrect du générateur de modèles automatique. Par exemple, sélectionnez :
      • Pages/Shared/_Layout.cshtml pour les projets Razor Pages ou Blazor Server avec l’infrastructure Razor Pages existante.
      • Views/Shared/_Layout.cshtml pour les projets MVC ou les projets Blazor Server avec une infrastructure MVC existante.
    • Pour le contexte de données (classe DbContext) :
      • Sélectionnez votre classe de contexte de données. Vous devez sélectionner au moins un fichier pour ajouter votre contexte de données.
      • Pour créer un contexte de données et éventuellement créer une classe d’utilisateur pour Identity, sélectionnez le bouton +. Acceptez la valeur par défaut ou spécifiez une classe (par exemple, Contoso.Data.ApplicationDbContext pour une société nommée « Contoso »). Pour créer une classe d’utilisateur, sélectionnez le bouton + pour la classe Utilisateur et spécifiez la classe (par exemple, ContosoUser pour une société nommée « Contoso »).
    • Sélectionnez le bouton Ajouter pour exécuter le générateur de modèles automatique.

Structurer Identity dans une application Blazor côté serveur avec autorisation

Installez le package NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Notes

Pour obtenir des conseils sur l’ajout de packages à des applications .NET, consultez les articles figurant sous Installer et gérer des packages dans Flux de travail de la consommation des packages (documentation NuGet). Vérifiez les versions du package sur NuGet.org.


Exécutez le générateur de modèles d’Identity automatique :

  • À partir de l’Explorateur de solutions, cliquez avec le bouton droit sur le projet >Ajouter>Nouvel élément de modèle généré automatiquement.
  • Dans le volet gauche de la boîte de dialogue Ajouter un nouvel élément généré automatiquement, sélectionnez Identity. Sélectionnez Identity dans le volet central. Sélectionnez le bouton Ajouter.
  • Dans la boîte de dialogue Ajouter Identity, sélectionnez les options souhaitées.
    • Si vous disposez d’une page de disposition personnalisée pour Identity (_Layout.cshtml), sélectionnez votre page de disposition existante pour éviter de remplacer votre mise en page avec un balisage incorrect du générateur de modèles automatique. Par exemple, sélectionnez :
      • Pages/Shared/_Layout.cshtml pour les projets Razor Pages ou Blazor Server avec l’infrastructure Razor Pages existante.
      • Views/Shared/_Layout.cshtml pour les projets MVC ou les projets Blazor Server avec une infrastructure MVC existante.
    • Pour le contexte de données (classe DbContext) :
      • Sélectionnez votre classe de contexte de données. Vous devez sélectionner au moins un fichier pour ajouter votre contexte de données.
      • Pour créer un contexte de données et éventuellement créer une classe d’utilisateur pour Identity, sélectionnez le bouton +. Acceptez la valeur par défaut ou spécifiez une classe (par exemple, Contoso.Data.ApplicationDbContext pour une société nommée « Contoso »). Pour créer une classe d’utilisateur, sélectionnez le bouton + pour la classe Utilisateur et spécifiez la classe (par exemple, ContosoUser pour une société nommée « Contoso »).
    • Sélectionnez le bouton Ajouter pour exécuter le générateur de modèles automatique.

Migrations

Le code de base de données d’Identity généré nécessite des migrations Entity Framework Core. Si une migration pour créer le schéma d’Identity n’a pas été créée et appliquée à la base de données, créez une migration et mettez à jour la base de données. Par exemple, exécutez les commandes suivantes :

Dans la console du Gestionnaire de packageVisual Studio :

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

Le paramètre de nom « CreateIdentitySchema » pour la commande Add-Migration est arbitraire. "CreateIdentitySchema" décrit la migration.

Si le schéma d’Identity a déjà été créé mais n’a pas été appliqué à la base de données, seule la commande de mise à jour de la base de données doit être exécutée :

Dans la console du Gestionnaire de package Visual Studio Update-Database:

Update-Database

Vous pouvez confirmer l’application d’un schéma d’Identity avec la commande suivante. La sortie de la commande inclut une colonne « applied » pour afficher les migrations appliquées à la base de données.

Dans la console du Gestionnaire de package Visual Studio, exécutez Get-Migration:

Get-Migration

S’il existe plusieurs contextes de base de données, spécifiez le contexte avec le paramètre -Context.

Styliser les points de terminaison d’authentification

Étant donné que Blazor utilise des pages RazorPagesIdentity, le style de l’interface utilisateur change lorsqu’un visiteur navigue entre les pages Identity et les composants. Vous disposez de deux options pour traiter les styles incongrus :

Composants d’Identity personnalisés

ASP.NET Core Identity est conçue pour fonctionner dans le contexte de la communication des requêtes et des réponses HTTP, qui n’est généralement pas le modèle de communication client-serveur principal de l’application Blazor. Les applications ASP.NET Core qui utilisent ASP.NET Core Identity pour la gestion des utilisateurs doivent utiliser Razor Pages plutôt que les composants Razor pour l’interface utilisateur en rapport avec Identity, notamment pour l’inscription des utilisateurs, la connexion, la déconnexion et d’autres tâches de gestion des utilisateurs.

Étant donné que SignInManager<TUser> et UserManager<TUser> ne sont pas pris en charge dans les composants Razor, nous vous recommandons d’utiliser l’API web pour gérer les actions d’Identity des composants Razor via une application ASP.NET Core avec Identity activée côté serveur. Pour obtenir des conseils sur la création d’API web pour les applications Blazor, consultez Appeler une API web à partir d’une application ASP.NET Core Blazor.

Une approche de l’utilisation de composants Razor pour Identity au lieu de pages Razor consiste à créer vos propres composants personnalisés d’IdentityRazor, mais Microsoft ne recommande pas ou ne prend pas en charge cette approche. Pour plus de contexte, explorez les discussions suivantes. Dans les discussions suivantes, les exemples de code dans les commentaires de problème et les exemples de code liés entre eux dans les référentiels GitHub non Microsoft ne sont pas pris en charge par Microsoft, mais peuvent être utiles à certains développeurs :

Pour obtenir une assistance supplémentaire lors de la recherche de composants d’IdentityRazor personnalisés ou de composants Razor tiers, nous vous recommandons les ressources suivantes :

Utiliser une disposition personnalisée avec des styles d’application Blazor

La disposition et les styles des pages d’Identity peuvent être modifiés pour produire des pages qui utilisent des styles similaires au thème Blazor par défaut. Cette approche n’est pas couverte par la documentation.

Applications Blazor côté client

Les applications Blazor côté client utilisent leurs propres approches d’interface utilisateur d’Identity et ne peuvent pas utiliser la génération de modèles d’Identity automatique d’ASP.NET Core. Les applications ASP.NET Core côté serveur de solutions Blazor hébergées peuvent suivre les instructions Razor Pages/MVC de cet article et sont configurées comme n’importe quel autre type d’application ASP.NET Core qui prend en charge Identity.

L’infrastructure Blazor n’inclut pas les versions des composants Razor des pages de l’interface utilisateur d’Identity. Les composants de l’interface utilisateur d’IdentityRazor peuvent être générés sur mesure ou obtenus à partir de sources tierces non prises en charge.

Pour plus d’informations, consultez les articles Sécurité Blazor et Identity.

Créer une source d’interface utilisateur d’Identity complète

Pour conserver un contrôle total de l’interface utilisateur d’Identity, exécutez le générateur de modèles d’Identity automatique et sélectionnez Remplacer tous les fichiers.

Configuration du mot de passe

Si PasswordOptions est configuré dans Startup.ConfigureServices, la configuration de l’attribut [StringLength] peut être requise pour la propriété Password dans les pages d’Identity générées automatiquement. Les propriétés InputModelPassword se trouvent dans les fichiers suivants :

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

Désactiver une page

Cette section montre comment désactiver la page d’inscription, mais l’approche peut être utilisée pour désactiver n’importe quelle page.

Pour désactiver l’inscription utilisateur :

  • Générez automatiquement des modèles d’Identity. Incluez Account.Register, Account.Login et Account.RegisterConfirmation. Par exemple :

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  • Mettez à jour Areas/Identity/Pages/Account/Register.cshtml.cs pour que les utilisateurs ne puissent pas s’inscrire à partir de ce point de terminaison :

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • Mettez à jour Areas/Identity/Pages/Account/Register.cshtml pour être cohérent avec les modifications précédentes :

    @page
    @model RegisterModel
    @{
        ViewData["Title"] = "Go to Login";
    }
    
    <h1>@ViewData["Title"]</h1>
    
    <li class="nav-item">
        <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
    </li>
    
  • Mettez en commentaires ou supprimez le lien d’inscription à partir de Areas/Identity/Pages/Account/Login.cshtml

    @*
    <p>
        <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
    </p>
    *@
    
  • Mettez à jour la page Areas/Identity/Pages/Account/RegisterConfirmation.

    • Supprimez le code et les liens du fichier cshtml.
    • Supprimez le code de confirmation du PageModel :
    [AllowAnonymous]
      public class RegisterConfirmationModel : PageModel
      {
          public IActionResult OnGet()
          {  
              return Page();
          }
      }
    

Utiliser une autre application pour ajouter des utilisateurs

Fournissez un mécanisme pour ajouter des utilisateurs en dehors de l’application web. Les options d’ajout d’utilisateurs sont les suivantes :

  • Une application web d’administration dédiée.
  • Une application console.

Le code suivant décrit une approche pour ajouter des utilisateurs :

  • Une liste d’utilisateurs est lue en mémoire.
  • Un mot de passe unique fort est généré pour chaque utilisateur.
  • L’utilisateur est ajouté à la base de données d’Identity.
  • L’utilisateur est averti et invité à modifier le mot de passe.
public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();

        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;

            try
            {
                var context = services.GetRequiredService<AppDbCntx>();
                context.Database.Migrate();

                var config = host.Services.GetRequiredService<IConfiguration>();
                var userList = config.GetSection("userList").Get<List<string>>();

                SeedData.Initialize(services, userList).Wait();
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occurred adding users.");
            }
        }

        host.Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

Le code suivant décrit l’ajout d’un utilisateur :


public static async Task Initialize(IServiceProvider serviceProvider,
                                    List<string> userList)
{
    var userManager = serviceProvider.GetService<UserManager<IdentityUser>>();

    foreach (var userName in userList)
    {
        var userPassword = GenerateSecurePassword();
        var userId = await EnsureUser(userManager, userName, userPassword);

        NotifyUser(userName, userPassword);
    }
}

private static async Task<string> EnsureUser(UserManager<IdentityUser> userManager,
                                             string userName, string userPassword)
{
    var user = await userManager.FindByNameAsync(userName);

    if (user == null)
    {
        user = new IdentityUser(userName)
        {
            EmailConfirmed = true
        };
        await userManager.CreateAsync(user, userPassword);
    }

    return user.Id;
}

Une approche similaire peut être suivie pour les scénarios de production.

Empêcher la publication de ressources statiques d’Identity

Pour empêcher la publication de ressources statiques d’Identity sur la racine web, consultez Présentation d’Identity sur ASP.NET Core.

ASP.NET Core fournit ASP.NET Core Identity en tant que bibliothèque de classes Razor. Les applications qui incluent Identity peuvent appliquer le générateur de modèles automatique de manière sélective pour ajouter le code source contenu dans la bibliothèque de classes d’IdentityRazor (RCL). Vous pouvez souhaiter générer le code source afin de pouvoir modifier le code et changer le comportement. Par exemple, vous pouvez demander au générateur de modèles automatique de générer le code utilisé dans l’inscription. Le code généré est prioritaire sur le même code dans la bibliothèque de classes Identityd’identité. Pour obtenir le contrôle total de l’interface utilisateur et ne pas utiliser la RCL par défaut, consultez la section Créer une source d’interface utilisateur d’Identity complète.

Les applications qui n’incluent pas l’authentification peuvent appliquer le générateur de modèles automatique pour ajouter le package RCL d’Identity. Vous pouvez sélectionner le code de Identity à générer.

Bien que le générateur de modèles génère la majeure partie du code nécessaire, vous devez mettre à jour votre projet pour terminer le processus. Ce document explique les étapes nécessaires pour effectuer une mise à jour de la génération de modèles d’Identity automatique.

Nous vous recommandons d’utiliser un système de contrôle de code source qui affiche les différences de fichiers et vous permet de revenir sur les modifications. Examinez les modifications après avoir exécuté le générateur de modèles d’Identity.

Des services sont requis lors de l’utilisation de l’authentification à deux facteurs, de la confirmation de compte et de la récupération de mot de passe, ainsi que d’autres fonctionnalités de sécurité avec Identity. Les services ou les stubs de service ne sont pas générés lors de la génération de modèles d’Identity automatique. Les services permettant d’activer ces fonctionnalités doivent être ajoutés manuellement. Par exemple, consultez Exiger un e-mail de confirmation.

Lors de la génération automatique de modèles d’Identity avec un nouveau contexte de données dans un projet avec des comptes individuels existants :

  • Dans Startup.ConfigureServices, supprimez les appels à :
    • AddDbContext
    • AddDefaultIdentity

Par exemple, AddDbContext et AddDefaultIdentity sont mis en commentaires dans le code suivant :

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

Le code précédent met en commentaires le code qui est dupliqué dans Areas/Identity/IdentityHostingStartup.cs

En règle générale, les applications qui ont été créées avec des comptes individuels ne doivent pas créer un nouveau contexte de données.

Générer automatiquement des modèles d’Identity dans un projet vide

Exécutez le générateur de modèles d’Identity automatique :

  • À partir de l’Explorateur de solutions, cliquez avec le bouton droit sur le projet >Ajouter>Nouvel élément de modèle généré automatiquement.
  • Dans le volet gauche de la boîte de dialogue Ajouter un nouvel élément généré automatiquement, sélectionnez Identity. Sélectionnez Identity dans le volet central. Sélectionnez le bouton Ajouter.
  • Dans la boîte de dialogue Ajouter Identity, sélectionnez les options souhaitées.
    • Si vous disposez d’une page de disposition personnalisée pour Identity (_Layout.cshtml), sélectionnez votre page de disposition existante pour éviter de remplacer votre mise en page avec un balisage incorrect du générateur de modèles automatique. Par exemple, sélectionnez :
      • Pages/Shared/_Layout.cshtml pour les projets Razor Pages ou Blazor Server avec l’infrastructure Razor Pages existante.
      • Views/Shared/_Layout.cshtml pour les projets MVC ou les projets Blazor Server avec une infrastructure MVC existante.
    • Pour le contexte de données (classe DbContext) :
      • Sélectionnez votre classe de contexte de données. Vous devez sélectionner au moins un fichier pour ajouter votre contexte de données.
      • Pour créer un contexte de données et éventuellement créer une classe d’utilisateur pour Identity, sélectionnez le bouton +. Acceptez la valeur par défaut ou spécifiez une classe (par exemple, Contoso.Data.ApplicationDbContext pour une société nommée « Contoso »). Pour créer une classe d’utilisateur, sélectionnez le bouton + pour la classe Utilisateur et spécifiez la classe (par exemple, ContosoUser pour une société nommée « Contoso »).
    • Sélectionnez le bouton Ajouter pour exécuter le générateur de modèles automatique.

Mettez à jour la classe Startup avec un code similaire à ce qui suit :

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
        services.AddRazorPages();
    }

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

        app.UseRouting();

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
            endpoints.MapRazorPages();
        });
    }
}

La commande UseHsts est recommandée, mais pas obligatoire. Pour plus d’informations, consultez Protocole HSTS (HTTP Strict Transport Security).

Le code de base de données d’Identity généré nécessite des migrations Entity Framework Core. Si une migration pour créer le schéma d’Identity n’a pas été créée et appliquée à la base de données, créez une migration et mettez à jour la base de données. Par exemple, exécutez les commandes suivantes :

Dans la console du Gestionnaire de packageVisual Studio :

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

Le paramètre de nom « CreateIdentitySchema » pour la commande Add-Migration est arbitraire. "CreateIdentitySchema" décrit la migration.

Si le schéma d’Identity a déjà été créé mais n’a pas été appliqué à la base de données, seule la commande de mise à jour de la base de données doit être exécutée :

Dans la console du Gestionnaire de package Visual Studio Update-Database:

Update-Database

Vous pouvez confirmer l’application d’un schéma d’Identity avec la commande suivante. La sortie de la commande inclut une colonne « applied » pour afficher les migrations appliquées à la base de données.

Dans la console du Gestionnaire de package Visual Studio, exécutez Get-Migration:

Get-Migration

S’il existe plusieurs contextes de base de données, spécifiez le contexte avec le paramètre -Context.

Générer un modèle d’Identity dans un projet Razor sans autorisation existante

Exécutez le générateur de modèles d’Identity automatique :

  • À partir de l’Explorateur de solutions, cliquez avec le bouton droit sur le projet >Ajouter>Nouvel élément de modèle généré automatiquement.
  • Dans le volet gauche de la boîte de dialogue Ajouter un nouvel élément généré automatiquement, sélectionnez Identity. Sélectionnez Identity dans le volet central. Sélectionnez le bouton Ajouter.
  • Dans la boîte de dialogue Ajouter Identity, sélectionnez les options souhaitées.
    • Si vous disposez d’une page de disposition personnalisée pour Identity (_Layout.cshtml), sélectionnez votre page de disposition existante pour éviter de remplacer votre mise en page avec un balisage incorrect du générateur de modèles automatique. Par exemple, sélectionnez :
      • Pages/Shared/_Layout.cshtml pour les projets Razor Pages ou Blazor Server avec l’infrastructure Razor Pages existante.
      • Views/Shared/_Layout.cshtml pour les projets MVC ou les projets Blazor Server avec une infrastructure MVC existante.
    • Pour le contexte de données (classe DbContext) :
      • Sélectionnez votre classe de contexte de données. Vous devez sélectionner au moins un fichier pour ajouter votre contexte de données.
      • Pour créer un contexte de données et éventuellement créer une classe d’utilisateur pour Identity, sélectionnez le bouton +. Acceptez la valeur par défaut ou spécifiez une classe (par exemple, Contoso.Data.ApplicationDbContext pour une société nommée « Contoso »). Pour créer une classe d’utilisateur, sélectionnez le bouton + pour la classe Utilisateur et spécifiez la classe (par exemple, ContosoUser pour une société nommée « Contoso »).
    • Sélectionnez le bouton Ajouter pour exécuter le générateur de modèles automatique.

Identity est configuré dans Areas/Identity/IdentityHostingStartup.cs. Pour plus d’informations, consultez IHostingStartup.

Migrations, UseAuthentication et disposition

Le code de base de données d’Identity généré nécessite des migrations Entity Framework Core. Si une migration pour créer le schéma d’Identity n’a pas été créée et appliquée à la base de données, créez une migration et mettez à jour la base de données. Par exemple, exécutez les commandes suivantes :

Dans la console du Gestionnaire de packageVisual Studio :

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

Le paramètre de nom « CreateIdentitySchema » pour la commande Add-Migration est arbitraire. "CreateIdentitySchema" décrit la migration.

Si le schéma d’Identity a déjà été créé mais n’a pas été appliqué à la base de données, seule la commande de mise à jour de la base de données doit être exécutée :

Dans la console du Gestionnaire de package Visual Studio Update-Database:

Update-Database

Vous pouvez confirmer l’application d’un schéma d’Identity avec la commande suivante. La sortie de la commande inclut une colonne « applied » pour afficher les migrations appliquées à la base de données.

Dans la console du Gestionnaire de package Visual Studio, exécutez Get-Migration:

Get-Migration

S’il existe plusieurs contextes de base de données, spécifiez le contexte avec le paramètre -Context.

Activer l’authentification

Mettez à jour la classe Startup avec un code similaire à ce qui suit :

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    }

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

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

        app.UseRouting();

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }
}

La commande UseHsts est recommandée, mais pas obligatoire. Pour plus d’informations, consultez Protocole HSTS (HTTP Strict Transport Security).

Modifications de disposition

Facultatif : ajoutez la connexion partielle (_LoginPartial) au fichier de disposition :

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - WebRP</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
    <link rel="stylesheet" href="~/css/site.css" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">WebRP</a>
                <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
                    <partial name="_LoginPartial" />
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                        </li>
                    </ul>
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2019 - WebRP - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

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

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

Générer un modèle d’Identity dans un projet Razor avec autorisation

Exécutez le générateur de modèles d’Identity automatique :

  • À partir de l’Explorateur de solutions, cliquez avec le bouton droit sur le projet >Ajouter>Nouvel élément de modèle généré automatiquement.
  • Dans le volet gauche de la boîte de dialogue Ajouter un nouvel élément généré automatiquement, sélectionnez Identity. Sélectionnez Identity dans le volet central. Sélectionnez le bouton Ajouter.
  • Dans la boîte de dialogue Ajouter Identity, sélectionnez les options souhaitées.
    • Si vous disposez d’une page de disposition personnalisée pour Identity (_Layout.cshtml), sélectionnez votre page de disposition existante pour éviter de remplacer votre mise en page avec un balisage incorrect du générateur de modèles automatique. Par exemple, sélectionnez :
      • Pages/Shared/_Layout.cshtml pour les projets Razor Pages ou Blazor Server avec l’infrastructure Razor Pages existante.
      • Views/Shared/_Layout.cshtml pour les projets MVC ou les projets Blazor Server avec une infrastructure MVC existante.
    • Pour le contexte de données (classe DbContext) :
      • Sélectionnez votre classe de contexte de données. Vous devez sélectionner au moins un fichier pour ajouter votre contexte de données.
      • Pour créer un contexte de données et éventuellement créer une classe d’utilisateur pour Identity, sélectionnez le bouton +. Acceptez la valeur par défaut ou spécifiez une classe (par exemple, Contoso.Data.ApplicationDbContext pour une société nommée « Contoso »). Pour créer une classe d’utilisateur, sélectionnez le bouton + pour la classe Utilisateur et spécifiez la classe (par exemple, ContosoUser pour une société nommée « Contoso »).
    • Sélectionnez le bouton Ajouter pour exécuter le générateur de modèles automatique.

Certaines options d’Identity sont configurées dans Areas/Identity/IdentityHostingStartup.cs. Pour plus d’informations, consultez IHostingStartup.

Générer un modèle d’Identity dans un projet MVC sans autorisation existante

Exécutez le générateur de modèles d’Identity automatique :

  • À partir de l’Explorateur de solutions, cliquez avec le bouton droit sur le projet >Ajouter>Nouvel élément de modèle généré automatiquement.
  • Dans le volet gauche de la boîte de dialogue Ajouter un nouvel élément généré automatiquement, sélectionnez Identity. Sélectionnez Identity dans le volet central. Sélectionnez le bouton Ajouter.
  • Dans la boîte de dialogue Ajouter Identity, sélectionnez les options souhaitées.
    • Si vous disposez d’une page de disposition personnalisée pour Identity (_Layout.cshtml), sélectionnez votre page de disposition existante pour éviter de remplacer votre mise en page avec un balisage incorrect du générateur de modèles automatique. Par exemple, sélectionnez :
      • Pages/Shared/_Layout.cshtml pour les projets Razor Pages ou Blazor Server avec l’infrastructure Razor Pages existante.
      • Views/Shared/_Layout.cshtml pour les projets MVC ou les projets Blazor Server avec une infrastructure MVC existante.
    • Pour le contexte de données (classe DbContext) :
      • Sélectionnez votre classe de contexte de données. Vous devez sélectionner au moins un fichier pour ajouter votre contexte de données.
      • Pour créer un contexte de données et éventuellement créer une classe d’utilisateur pour Identity, sélectionnez le bouton +. Acceptez la valeur par défaut ou spécifiez une classe (par exemple, Contoso.Data.ApplicationDbContext pour une société nommée « Contoso »). Pour créer une classe d’utilisateur, sélectionnez le bouton + pour la classe Utilisateur et spécifiez la classe (par exemple, ContosoUser pour une société nommée « Contoso »).
    • Sélectionnez le bouton Ajouter pour exécuter le générateur de modèles automatique.

Facultatif : ajoutez la connexion partielle (_LoginPartial) au fichier Views/Shared/_Layout.cshtml :

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - WebRP</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
    <link rel="stylesheet" href="~/css/site.css" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">WebRP</a>
                <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
                    <partial name="_LoginPartial" />
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                        </li>
                    </ul>
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2019 - WebRP - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

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

    @RenderSection("Scripts", required: false)
</body>
</html>
  • Déplacer le fichier Pages/Shared/_LoginPartial.cshtml vers Views/Shared/_LoginPartial.cshtml

Identity est configuré dans Areas/Identity/IdentityHostingStartup.cs. Pour plus d’informations, consultez IHostingStartup.

Le code de base de données d’Identity généré nécessite des migrations Entity Framework Core. Si une migration pour créer le schéma d’Identity n’a pas été créée et appliquée à la base de données, créez une migration et mettez à jour la base de données. Par exemple, exécutez les commandes suivantes :

Dans la console du Gestionnaire de packageVisual Studio :

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

Le paramètre de nom « CreateIdentitySchema » pour la commande Add-Migration est arbitraire. "CreateIdentitySchema" décrit la migration.

Si le schéma d’Identity a déjà été créé mais n’a pas été appliqué à la base de données, seule la commande de mise à jour de la base de données doit être exécutée :

Dans la console du Gestionnaire de package Visual Studio Update-Database:

Update-Database

Vous pouvez confirmer l’application d’un schéma d’Identity avec la commande suivante. La sortie de la commande inclut une colonne « applied » pour afficher les migrations appliquées à la base de données.

Dans la console du Gestionnaire de package Visual Studio, exécutez Get-Migration:

Get-Migration

S’il existe plusieurs contextes de base de données, spécifiez le contexte avec le paramètre -Context.

Mettez à jour la classe Startup avec un code similaire à ce qui suit :

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
        services.AddRazorPages();
    }

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

        app.UseRouting();

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
            endpoints.MapRazorPages();
        });
    }
}

La commande UseHsts est recommandée, mais pas obligatoire. Pour plus d’informations, consultez Protocole HSTS (HTTP Strict Transport Security).

Générer un modèle d’Identity dans un projet MVC avec autorisation

Exécutez le générateur de modèles d’Identity automatique :

  • À partir de l’Explorateur de solutions, cliquez avec le bouton droit sur le projet >Ajouter>Nouvel élément de modèle généré automatiquement.
  • Dans le volet gauche de la boîte de dialogue Ajouter un nouvel élément généré automatiquement, sélectionnez Identity. Sélectionnez Identity dans le volet central. Sélectionnez le bouton Ajouter.
  • Dans la boîte de dialogue Ajouter Identity, sélectionnez les options souhaitées.
    • Si vous disposez d’une page de disposition personnalisée pour Identity (_Layout.cshtml), sélectionnez votre page de disposition existante pour éviter de remplacer votre mise en page avec un balisage incorrect du générateur de modèles automatique. Par exemple, sélectionnez :
      • Pages/Shared/_Layout.cshtml pour les projets Razor Pages ou Blazor Server avec l’infrastructure Razor Pages existante.
      • Views/Shared/_Layout.cshtml pour les projets MVC ou les projets Blazor Server avec une infrastructure MVC existante.
    • Pour le contexte de données (classe DbContext) :
      • Sélectionnez votre classe de contexte de données. Vous devez sélectionner au moins un fichier pour ajouter votre contexte de données.
      • Pour créer un contexte de données et éventuellement créer une classe d’utilisateur pour Identity, sélectionnez le bouton +. Acceptez la valeur par défaut ou spécifiez une classe (par exemple, Contoso.Data.ApplicationDbContext pour une société nommée « Contoso »). Pour créer une classe d’utilisateur, sélectionnez le bouton + pour la classe Utilisateur et spécifiez la classe (par exemple, ContosoUser pour une société nommée « Contoso »).
    • Sélectionnez le bouton Ajouter pour exécuter le générateur de modèles automatique.

Structurer Identity dans une application Blazor côté serveur sans autorisation existante

Exécutez le générateur de modèles d’Identity automatique :

  • À partir de l’Explorateur de solutions, cliquez avec le bouton droit sur le projet >Ajouter>Nouvel élément de modèle généré automatiquement.
  • Dans le volet gauche de la boîte de dialogue Ajouter un nouvel élément généré automatiquement, sélectionnez Identity. Sélectionnez Identity dans le volet central. Sélectionnez le bouton Ajouter.
  • Dans la boîte de dialogue Ajouter Identity, sélectionnez les options souhaitées.
    • Si vous disposez d’une page de disposition personnalisée pour Identity (_Layout.cshtml), sélectionnez votre page de disposition existante pour éviter de remplacer votre mise en page avec un balisage incorrect du générateur de modèles automatique. Par exemple, sélectionnez :
      • Pages/Shared/_Layout.cshtml pour les projets Razor Pages ou Blazor Server avec l’infrastructure Razor Pages existante.
      • Views/Shared/_Layout.cshtml pour les projets MVC ou les projets Blazor Server avec une infrastructure MVC existante.
    • Pour le contexte de données (classe DbContext) :
      • Sélectionnez votre classe de contexte de données. Vous devez sélectionner au moins un fichier pour ajouter votre contexte de données.
      • Pour créer un contexte de données et éventuellement créer une classe d’utilisateur pour Identity, sélectionnez le bouton +. Acceptez la valeur par défaut ou spécifiez une classe (par exemple, Contoso.Data.ApplicationDbContext pour une société nommée « Contoso »). Pour créer une classe d’utilisateur, sélectionnez le bouton + pour la classe Utilisateur et spécifiez la classe (par exemple, ContosoUser pour une société nommée « Contoso »).
    • Sélectionnez le bouton Ajouter pour exécuter le générateur de modèles automatique.

Identity est configuré dans Areas/Identity/IdentityHostingStartup.cs. Pour plus d’informations, consultez IHostingStartup.

Migrations

Le code de base de données d’Identity généré nécessite des migrations Entity Framework Core. Si une migration pour créer le schéma d’Identity n’a pas été créée et appliquée à la base de données, créez une migration et mettez à jour la base de données. Par exemple, exécutez les commandes suivantes :

Dans la console du Gestionnaire de packageVisual Studio :

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

Le paramètre de nom « CreateIdentitySchema » pour la commande Add-Migration est arbitraire. "CreateIdentitySchema" décrit la migration.

Si le schéma d’Identity a déjà été créé mais n’a pas été appliqué à la base de données, seule la commande de mise à jour de la base de données doit être exécutée :

Dans la console du Gestionnaire de package Visual Studio Update-Database:

Update-Database

Vous pouvez confirmer l’application d’un schéma d’Identity avec la commande suivante. La sortie de la commande inclut une colonne « applied » pour afficher les migrations appliquées à la base de données.

Dans la console du Gestionnaire de package Visual Studio, exécutez Get-Migration:

Get-Migration

S’il existe plusieurs contextes de base de données, spécifiez le contexte avec le paramètre -Context.

Styliser les points de terminaison d’authentification

Étant donné que Blazor utilise des pages RazorPagesIdentity, le style de l’interface utilisateur change lorsqu’un visiteur navigue entre les pages Identity et les composants. Vous disposez de deux options pour traiter les styles incongrus :

Composants d’Identity personnalisés

Une approche de l’utilisation de composants pour Identity au lieu de pages consiste à générer des composants d’Identity. Étant donné que SignInManager et UserManager ne sont pas pris en charge dans les composants Razor, utilisez des points de terminaison d’API web dans l’application Blazor pour traiter les actions de compte d’utilisateur.

Utiliser une disposition personnalisée avec des styles d’application Blazor

La disposition et les styles des pages d’Identity peuvent être modifiés pour produire des pages qui utilisent des styles similaires au thème Blazor par défaut. Cette approche n’est pas couverte par la documentation.

Structurer Identity dans une application Blazor côté serveur avec autorisation

Exécutez le générateur de modèles d’Identity automatique :

  • À partir de l’Explorateur de solutions, cliquez avec le bouton droit sur le projet >Ajouter>Nouvel élément de modèle généré automatiquement.
  • Dans le volet gauche de la boîte de dialogue Ajouter un nouvel élément généré automatiquement, sélectionnez Identity. Sélectionnez Identity dans le volet central. Sélectionnez le bouton Ajouter.
  • Dans la boîte de dialogue Ajouter Identity, sélectionnez les options souhaitées.
    • Si vous disposez d’une page de disposition personnalisée pour Identity (_Layout.cshtml), sélectionnez votre page de disposition existante pour éviter de remplacer votre mise en page avec un balisage incorrect du générateur de modèles automatique. Par exemple, sélectionnez :
      • Pages/Shared/_Layout.cshtml pour les projets Razor Pages ou Blazor Server avec l’infrastructure Razor Pages existante.
      • Views/Shared/_Layout.cshtml pour les projets MVC ou les projets Blazor Server avec une infrastructure MVC existante.
    • Pour le contexte de données (classe DbContext) :
      • Sélectionnez votre classe de contexte de données. Vous devez sélectionner au moins un fichier pour ajouter votre contexte de données.
      • Pour créer un contexte de données et éventuellement créer une classe d’utilisateur pour Identity, sélectionnez le bouton +. Acceptez la valeur par défaut ou spécifiez une classe (par exemple, Contoso.Data.ApplicationDbContext pour une société nommée « Contoso »). Pour créer une classe d’utilisateur, sélectionnez le bouton + pour la classe Utilisateur et spécifiez la classe (par exemple, ContosoUser pour une société nommée « Contoso »).
    • Sélectionnez le bouton Ajouter pour exécuter le générateur de modèles automatique.

Certaines options d’Identity sont configurées dans Areas/Identity/IdentityHostingStartup.cs. Pour plus d’informations, consultez IHostingStartup.

Applications Blazor côté client

Les applications Blazor côté client utilisent leurs propres approches d’interface utilisateur d’Identity et ne peuvent pas utiliser la génération de modèles d’Identity automatique d’ASP.NET Core. Les applications ASP.NET Core côté serveur de solutions Blazor hébergées peuvent suivre les instructions Razor Pages/MVC de cet article et sont configurées comme n’importe quel autre type d’application ASP.NET Core qui prend en charge Identity.

L’infrastructure Blazor n’inclut pas les versions des composants Razor des pages de l’interface utilisateur d’Identity. Les composants de l’interface utilisateur d’IdentityRazor peuvent être générés sur mesure ou obtenus à partir de sources tierces non prises en charge.

Pour plus d’informations, consultez les articles Sécurité Blazor et Identity.

Créer une source d’interface utilisateur d’Identity complète

Pour conserver un contrôle total de l’interface utilisateur d’Identity, exécutez le générateur de modèles d’Identity automatique et sélectionnez Remplacer tous les fichiers.

Le code mis en évidence suivant montre les modifications à apporter pour remplacer l’interface utilisateur d’Identity par défaut par Identity dans une application web ASP.NET Core 2.1. Vous pouvez effectuer cette opération pour avoir un contrôle total de l’interface utilisateur d’Identity.

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity<IdentityUser, IdentityRole>()
        // services.AddDefaultIdentity<IdentityUser>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddMvc()
        .AddRazorPagesOptions(options =>
        {
            options.Conventions.AuthorizeAreaFolder("Identity", "/Account/Manage");
            options.Conventions.AuthorizeAreaPage("Identity", "/Account/Logout");
        });

    services.ConfigureApplicationCookie(options =>
    {
        options.LoginPath = $"/Identity/Account/Login";
        options.LogoutPath = $"/Identity/Account/Logout";
        options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
    });

    // using Microsoft.AspNetCore.Identity.UI.Services;
    services.AddSingleton<IEmailSender, EmailSender>();
}

La version d’Identity par défaut est remplacée dans le code suivant :

services.AddIdentity<IdentityUser, IdentityRole>()
    // services.AddDefaultIdentity<IdentityUser>()
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders();

Le code suivant définit LoginPath, LogoutPath et AccessDeniedPath):

services.ConfigureApplicationCookie(options =>
{
    options.LoginPath = $"/Identity/Account/Login";
    options.LogoutPath = $"/Identity/Account/Logout";
    options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
});

Inscrivez une implémentation IEmailSender, par exemple :

// using Microsoft.AspNetCore.Identity.UI.Services;
services.AddSingleton<IEmailSender, EmailSender>();
public class EmailSender : IEmailSender
{
    public Task SendEmailAsync(string email, string subject, string message)
    {
        return Task.CompletedTask;
    }
}

Configuration du mot de passe

Si PasswordOptions est configuré dans Startup.ConfigureServices, la configuration de l’attribut [StringLength] peut être requise pour la propriété Password dans les pages d’Identity générées automatiquement. Les propriétés InputModelPassword se trouvent dans les fichiers suivants :

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

Désactiver une page

Cette section montre comment désactiver la page d’inscription, mais l’approche peut être utilisée pour désactiver n’importe quelle page.

Pour désactiver l’inscription utilisateur :

  • Générez automatiquement des modèles d’Identity. Incluez Account.Register, Account.Login et Account.RegisterConfirmation. Par exemple :

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  • Mettez à jour Areas/Identity/Pages/Account/Register.cshtml.cs pour que les utilisateurs ne puissent pas s’inscrire à partir de ce point de terminaison :

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • Mettez à jour Areas/Identity/Pages/Account/Register.cshtml pour être cohérent avec les modifications précédentes :

    @page
    @model RegisterModel
    @{
        ViewData["Title"] = "Go to Login";
    }
    
    <h1>@ViewData["Title"]</h1>
    
    <li class="nav-item">
        <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
    </li>
    
  • Mettez en commentaires ou supprimez le lien d’inscription à partir de Areas/Identity/Pages/Account/Login.cshtml

    @*
    <p>
        <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
    </p>
    *@
    
  • Mettez à jour la page Areas/Identity/Pages/Account/RegisterConfirmation.

    • Supprimez le code et les liens du fichier cshtml.
    • Supprimez le code de confirmation du PageModel :
    [AllowAnonymous]
      public class RegisterConfirmationModel : PageModel
      {
          public IActionResult OnGet()
          {  
              return Page();
          }
      }
    

Utiliser une autre application pour ajouter des utilisateurs

Fournissez un mécanisme pour ajouter des utilisateurs en dehors de l’application web. Les options d’ajout d’utilisateurs sont les suivantes :

  • Une application web d’administration dédiée.
  • Une application console.

Le code suivant décrit une approche pour ajouter des utilisateurs :

  • Une liste d’utilisateurs est lue en mémoire.
  • Un mot de passe unique fort est généré pour chaque utilisateur.
  • L’utilisateur est ajouté à la base de données d’Identity.
  • L’utilisateur est averti et invité à modifier le mot de passe.
public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();

        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;

            try
            {
                var context = services.GetRequiredService<AppDbCntx>();
                context.Database.Migrate();

                var config = host.Services.GetRequiredService<IConfiguration>();
                var userList = config.GetSection("userList").Get<List<string>>();

                SeedData.Initialize(services, userList).Wait();
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occurred adding users.");
            }
        }

        host.Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

Le code suivant décrit l’ajout d’un utilisateur :


public static async Task Initialize(IServiceProvider serviceProvider,
                                    List<string> userList)
{
    var userManager = serviceProvider.GetService<UserManager<IdentityUser>>();

    foreach (var userName in userList)
    {
        var userPassword = GenerateSecurePassword();
        var userId = await EnsureUser(userManager, userName, userPassword);

        NotifyUser(userName, userPassword);
    }
}

private static async Task<string> EnsureUser(UserManager<IdentityUser> userManager,
                                             string userName, string userPassword)
{
    var user = await userManager.FindByNameAsync(userName);

    if (user == null)
    {
        user = new IdentityUser(userName)
        {
            EmailConfirmed = true
        };
        await userManager.CreateAsync(user, userPassword);
    }

    return user.Id;
}

Une approche similaire peut être suivie pour les scénarios de production.

Empêcher la publication de ressources statiques d’Identity

Pour empêcher la publication de ressources statiques d’Identity sur la racine web, consultez Présentation d’Identity sur ASP.NET Core.

Ressources supplémentaires