Eseguire lo scaffolding Identity nei progetti ASP.NET Core

Di Rick Anderson

ASP.NET Core fornisce ASP.NET CoreIdentitycome libreria di Razor classi. Le applicazioni che includono Identity possono applicare lo scaffolder per aggiungere in modo selettivo il codice sorgente contenuto nella IdentityRazor libreria di classi (RCL). Se si vuole generare un codice sorgente, è possibile modificare il codice e modificarne il comportamento. Ad esempio, è possibile indicare allo scaffolder di generare il codice usato nella registrazione. Il codice generato ha la precedenza sullo stesso codice nell'RCL Identity . Per ottenere il controllo completo dell'interfaccia utente e non usare l'RCL predefinito, vedere la sezione Creare l'origine completa Identity dell'interfaccia utente.

Le applicazioni che non includono l'autenticazione possono applicare lo scaffolder per aggiungere il pacchetto RCL Identity . È possibile selezionare Identity il codice da generare.

Anche se lo scaffolder genera la maggior parte del codice necessario, è necessario aggiornare il progetto per completare il processo. Questo documento illustra i passaggi necessari per completare un Identity aggiornamento dello scaffolding.

È consigliabile usare un sistema di controllo del codice sorgente che mostra le differenze tra i file e consente di eseguire il backup delle modifiche. Esaminare le modifiche dopo l'esecuzione dello Identity scaffolder.

I servizi sono necessari quando si usano Two Factor Authentication, la conferma dell'account e il ripristino delle password e altre funzionalità di sicurezza con Identity. I servizi o gli stub del servizio non vengono generati durante lo scaffolding Identitydi . I servizi per abilitare queste funzionalità devono essere aggiunti manualmente. Ad esempio, vedere Richiedi conferma tramite posta elettronica.

In genere, le app create con singoli account non devono creare un nuovo contesto dati.

Eseguire lo scaffolding Identity in un Razor progetto senza autorizzazione esistente

Installare il pacchetto NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design .

Nota

Per indicazioni sull'aggiunta di pacchetti alle app .NET, vedere gli articoli sotto Installare e gestire pacchetti in Flusso di lavoro dell'utilizzo di pacchetti (documentazione di NuGet). Confermare le versioni corrette del pacchetto all'indirizzo NuGet.org.


Eseguire lo Identity scaffolder:

  • Da Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto >Aggiungi>nuovo elemento con scaffolding.
  • Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Identity. Selezionare Identity nel riquadro centrale. Seleziona il pulsante Aggiungi.
  • Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate.
    • Se si dispone di una pagina di layout personalizzata esistente per Identity (_Layout.cshtml), selezionare la pagina di layout esistente per evitare di sovrascrivere il layout con markup errato dallo scaffolder. Ad esempio, selezionare:
      • Pages/Shared/_Layout.cshtml per Razor Pagine o Blazor Server progetti con l'infrastruttura Pages esistente Razor .
      • Views/Shared/_Layout.cshtml per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
    • Per il contesto dati (classe DbContext):
      • Selezionare la classe del contesto dati. È necessario selezionare almeno un file per aggiungere il contesto dati.
      • Per creare un contesto dati ed eventualmente creare una nuova classe utente per Identity, selezionare il + pulsante . Accettare il valore predefinito o specificare una classe , Contoso.Data.ApplicationDbContext ad esempio per una società denominata "Contoso". Per creare una nuova classe utente, selezionare il + pulsante Per classe User e specificare la classe (ad esempio, ContosoUser per una società denominata "Contoso").
    • Selezionare il pulsante Aggiungi per eseguire lo scaffolder.

Migrazioni, UseAuthentication e layout

Il codice del database generato Identity richiede Migrazioni di Entity Framework Core. Se una migrazione per creare lo Identity schema non è stata creata e applicata al database, creare una migrazione e aggiornare il database. Ad esempio, eseguire i comandi seguenti:

Nella console di Visual Studio Gestione pacchetti:

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

Il parametro del nome "CreaIdentityschema" per il Add-Migration comando è arbitrario. "CreateIdentitySchema" descrive la migrazione.

Se lo Identity schema è già stato creato ma non applicato al database, è necessario eseguire solo il comando per aggiornare il database:

Nella console di Visual Studio Gestione pacchetti eseguire Update-Database:

Update-Database

È possibile confermare l'applicazione di uno Identity schema con il comando seguente. L'output del comando include una colonna "applied" per mostrare quali migrazioni vengono applicate al database.

Nella console di Visual Studio Gestione pacchetti eseguire Get-Migration:

Get-Migration

Se esistono più contesti di database, specificare il contesto con il -Context parametro .

Modifiche al layout

Facoltativo: aggiungere l'account di accesso parziale (_LoginPartial) al file di layout:

<!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>

Eseguire lo scaffolding Identity in un Razor progetto con autorizzazione

Installare il pacchetto NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design .

Nota

Per indicazioni sull'aggiunta di pacchetti alle app .NET, vedere gli articoli sotto Installare e gestire pacchetti in Flusso di lavoro dell'utilizzo di pacchetti (documentazione di NuGet). Confermare le versioni corrette del pacchetto all'indirizzo NuGet.org.


Eseguire lo Identity scaffolder:

  • Da Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto >Aggiungi>nuovo elemento con scaffolding.
  • Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Identity. Selezionare Identity nel riquadro centrale. Seleziona il pulsante Aggiungi.
  • Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate.
    • Se si dispone di una pagina di layout personalizzata esistente per Identity (_Layout.cshtml), selezionare la pagina di layout esistente per evitare di sovrascrivere il layout con markup errato dallo scaffolder. Ad esempio, selezionare:
      • Pages/Shared/_Layout.cshtml per Razor Pagine o Blazor Server progetti con l'infrastruttura Pages esistente Razor .
      • Views/Shared/_Layout.cshtml per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
    • Per il contesto dati (classe DbContext):
      • Selezionare la classe del contesto dati. È necessario selezionare almeno un file per aggiungere il contesto dati.
      • Per creare un contesto dati ed eventualmente creare una nuova classe utente per Identity, selezionare il + pulsante . Accettare il valore predefinito o specificare una classe , Contoso.Data.ApplicationDbContext ad esempio per una società denominata "Contoso". Per creare una nuova classe utente, selezionare il + pulsante Per classe User e specificare la classe (ad esempio, ContosoUser per una società denominata "Contoso").
    • Selezionare il pulsante Aggiungi per eseguire lo scaffolder.

Eseguire lo scaffolding Identity in un progetto MVC senza autorizzazione esistente

Installare il pacchetto NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design .

Nota

Per indicazioni sull'aggiunta di pacchetti alle app .NET, vedere gli articoli sotto Installare e gestire pacchetti in Flusso di lavoro dell'utilizzo di pacchetti (documentazione di NuGet). Confermare le versioni corrette del pacchetto all'indirizzo NuGet.org.


Eseguire lo Identity scaffolder:

  • Da Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto >Aggiungi>nuovo elemento con scaffolding.
  • Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Identity. Selezionare Identity nel riquadro centrale. Seleziona il pulsante Aggiungi.
  • Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate.
    • Se si dispone di una pagina di layout personalizzata esistente per Identity (_Layout.cshtml), selezionare la pagina di layout esistente per evitare di sovrascrivere il layout con markup errato dallo scaffolder. Ad esempio, selezionare:
      • Pages/Shared/_Layout.cshtml per Razor Pagine o Blazor Server progetti con l'infrastruttura Pages esistente Razor .
      • Views/Shared/_Layout.cshtml per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
    • Per il contesto dati (classe DbContext):
      • Selezionare la classe del contesto dati. È necessario selezionare almeno un file per aggiungere il contesto dati.
      • Per creare un contesto dati ed eventualmente creare una nuova classe utente per Identity, selezionare il + pulsante . Accettare il valore predefinito o specificare una classe , Contoso.Data.ApplicationDbContext ad esempio per una società denominata "Contoso". Per creare una nuova classe utente, selezionare il + pulsante Per classe User e specificare la classe (ad esempio, ContosoUser per una società denominata "Contoso").
    • Selezionare il pulsante Aggiungi per eseguire lo scaffolder.

Facoltativo: aggiungere l'account di accesso parziale (_LoginPartial) al Views/Shared/_Layout.cshtml file:

<!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>

Il codice del database generato Identity richiede Migrazioni di Entity Framework Core. Se una migrazione per creare lo Identity schema non è stata creata e applicata al database, creare una migrazione e aggiornare il database. Ad esempio, eseguire i comandi seguenti:

Nella console di Visual Studio Gestione pacchetti:

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

Il parametro del nome "CreaIdentityschema" per il Add-Migration comando è arbitrario. "CreateIdentitySchema" descrive la migrazione.

Se lo Identity schema è già stato creato ma non applicato al database, è necessario eseguire solo il comando per aggiornare il database:

Nella console di Visual Studio Gestione pacchetti eseguire Update-Database:

Update-Database

È possibile confermare l'applicazione di uno Identity schema con il comando seguente. L'output del comando include una colonna "applied" per mostrare quali migrazioni vengono applicate al database.

Nella console di Visual Studio Gestione pacchetti eseguire Get-Migration:

Get-Migration

Se esistono più contesti di database, specificare il contesto con il -Context parametro .

Aggiungere MapRazorPages a Program.cs come illustrato nel codice evidenziato seguente:

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

Eseguire lo scaffolding Identity in un progetto MVC con autorizzazione

Installare il pacchetto NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design .

Nota

Per indicazioni sull'aggiunta di pacchetti alle app .NET, vedere gli articoli sotto Installare e gestire pacchetti in Flusso di lavoro dell'utilizzo di pacchetti (documentazione di NuGet). Confermare le versioni corrette del pacchetto all'indirizzo NuGet.org.


Eseguire lo Identity scaffolder:

  • Da Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto >Aggiungi>nuovo elemento con scaffolding.
  • Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Identity. Selezionare Identity nel riquadro centrale. Seleziona il pulsante Aggiungi.
  • Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate.
    • Se si dispone di una pagina di layout personalizzata esistente per Identity (_Layout.cshtml), selezionare la pagina di layout esistente per evitare di sovrascrivere il layout con markup errato dallo scaffolder. Ad esempio, selezionare:
      • Pages/Shared/_Layout.cshtml per Razor Pagine o Blazor Server progetti con l'infrastruttura Pages esistente Razor .
      • Views/Shared/_Layout.cshtml per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
    • Per il contesto dati (classe DbContext):
      • Selezionare la classe del contesto dati. È necessario selezionare almeno un file per aggiungere il contesto dati.
      • Per creare un contesto dati ed eventualmente creare una nuova classe utente per Identity, selezionare il + pulsante . Accettare il valore predefinito o specificare una classe , Contoso.Data.ApplicationDbContext ad esempio per una società denominata "Contoso". Per creare una nuova classe utente, selezionare il + pulsante Per classe User e specificare la classe (ad esempio, ContosoUser per una società denominata "Contoso").
    • Selezionare il pulsante Aggiungi per eseguire lo scaffolder.

App lato Blazor client

Le app sul lato Blazor client usano approcci di interfaccia utente personalizzati Identity e non possono usare ASP.NET scaffolding core Identity .

Le app principali ASP.NET lato server possono seguire le Razor linee guida Pages/MVC in questo articolo e sono configurate esattamente come qualsiasi altro tipo di app ASP.NET Core che supporta Identity. Il Blazor framework usa le Razor versioni dei componenti () delle pagine dell'interfaccia Identity utente (.razor.cshtml) durante lo scaffolding Identity in un'app Blazor Web.

Per altre informazioni, vedere gli Blazor articoli Sicurezza e Identity .

Creare un'origine completa Identity dell'interfaccia utente

Per mantenere il controllo completo dell'interfaccia Identity utente, eseguire lo Identity scaffolder e selezionare Sostituisci tutti i file.

Configurazione della password

Se PasswordOptions sono configurati in Startup.ConfigureServices, [StringLength] la configurazione dell'attributo potrebbe essere necessaria per la Password proprietà nelle pagine con scaffolding Identity . InputModelPassword Le proprietà sono disponibili nei file seguenti:

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

Disabilitare una pagina

Questa sezione illustra come disabilitare la pagina di registrazione, ma l'approccio può essere usato per disabilitare qualsiasi pagina.

Per disabilitare la registrazione utente:

  • Eseguire lo scaffolding Identitydi . Includere Account.Register, Account.Login e Account.RegisterConfirmation. Ad esempio:

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  • Aggiornare Areas/Identity/Pages/Account/Register.cshtml.cs in modo che gli utenti non possano eseguire la registrazione da questo endpoint:

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • Aggiornare Areas/Identity/Pages/Account/Register.cshtml in modo che sia coerente con le modifiche precedenti:

    @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>
    
  • Impostare come commento o rimuovere il collegamento di registrazione da Areas/Identity/Pages/Account/Login.cshtml

    @*
    <p>
        <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
    </p>
    *@
    
  • Aggiornare la pagina Aree//IdentityPagine/Account/RegisterConfirmation .

    • Rimuovere il codice e i collegamenti dal file cshtml.
    • Rimuovere il codice di conferma da PageModel:
    [AllowAnonymous]
      public class RegisterConfirmationModel : PageModel
      {
          public IActionResult OnGet()
          {  
              return Page();
          }
      }
    

Usare un'altra app per aggiungere utenti

Fornire un meccanismo per aggiungere utenti esterni all'app Web. Le opzioni per aggiungere utenti includono:

  • Un'app Web di amministrazione dedicata.
  • Un'app console.

Il codice seguente descrive un approccio all'aggiunta di utenti:

  • Un elenco di utenti viene letto in memoria.
  • Per ogni utente viene generata una password univoca complessa.
  • L'utente viene aggiunto al Identity database.
  • L'utente riceve una notifica e comunica di modificare la password.
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>();
            });
}

Il codice seguente descrive l'aggiunta di un utente:


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

È possibile seguire un approccio simile per gli scenari di produzione.

Impedire la pubblicazione di asset statici Identity

Per impedire la pubblicazione di asset statici Identity nella radice Web, vedere Introduzione a Identity in ASP.NET Core.

ASP.NET Core fornisce ASP.NET CoreIdentitycome libreria di Razor classi. Le applicazioni che includono Identity possono applicare lo scaffolder per aggiungere in modo selettivo il codice sorgente contenuto nella IdentityRazor libreria di classi (RCL). Se si vuole generare un codice sorgente, è possibile modificare il codice e modificarne il comportamento. Ad esempio, è possibile indicare allo scaffolder di generare il codice usato nella registrazione. Il codice generato ha la precedenza sullo stesso codice nell'RCL Identity . Per ottenere il controllo completo dell'interfaccia utente e non usare l'RCL predefinito, vedere la sezione Creare l'origine completa Identity dell'interfaccia utente.

Le applicazioni che non includono l'autenticazione possono applicare lo scaffolder per aggiungere il pacchetto RCL Identity . È possibile selezionare Identity il codice da generare.

Anche se lo scaffolder genera la maggior parte del codice necessario, è necessario aggiornare il progetto per completare il processo. Questo documento illustra i passaggi necessari per completare un Identity aggiornamento dello scaffolding.

È consigliabile usare un sistema di controllo del codice sorgente che mostra le differenze tra i file e consente di eseguire il backup delle modifiche. Esaminare le modifiche dopo l'esecuzione dello Identity scaffolder.

I servizi sono necessari quando si usano Two Factor Authentication, la conferma dell'account e il ripristino delle password e altre funzionalità di sicurezza con Identity. I servizi o gli stub del servizio non vengono generati durante lo scaffolding Identitydi . I servizi per abilitare queste funzionalità devono essere aggiunti manualmente. Ad esempio, vedere Richiedi conferma tramite posta elettronica.

In genere, le app create con singoli account non devono creare un nuovo contesto dati.

Eseguire lo scaffolding Identity in un Razor progetto senza autorizzazione esistente

Installare il pacchetto NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design .

Nota

Per indicazioni sull'aggiunta di pacchetti alle app .NET, vedere gli articoli sotto Installare e gestire pacchetti in Flusso di lavoro dell'utilizzo di pacchetti (documentazione di NuGet). Confermare le versioni corrette del pacchetto all'indirizzo NuGet.org.


Eseguire lo Identity scaffolder:

  • Da Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto >Aggiungi>nuovo elemento con scaffolding.
  • Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Identity. Selezionare Identity nel riquadro centrale. Seleziona il pulsante Aggiungi.
  • Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate.
    • Se si dispone di una pagina di layout personalizzata esistente per Identity (_Layout.cshtml), selezionare la pagina di layout esistente per evitare di sovrascrivere il layout con markup errato dallo scaffolder. Ad esempio, selezionare:
      • Pages/Shared/_Layout.cshtml per Razor Pagine o Blazor Server progetti con l'infrastruttura Pages esistente Razor .
      • Views/Shared/_Layout.cshtml per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
    • Per il contesto dati (classe DbContext):
      • Selezionare la classe del contesto dati. È necessario selezionare almeno un file per aggiungere il contesto dati.
      • Per creare un contesto dati ed eventualmente creare una nuova classe utente per Identity, selezionare il + pulsante . Accettare il valore predefinito o specificare una classe , Contoso.Data.ApplicationDbContext ad esempio per una società denominata "Contoso". Per creare una nuova classe utente, selezionare il + pulsante Per classe User e specificare la classe (ad esempio, ContosoUser per una società denominata "Contoso").
    • Selezionare il pulsante Aggiungi per eseguire lo scaffolder.

Migrazioni, UseAuthentication e layout

Il codice del database generato Identity richiede Migrazioni di Entity Framework Core. Se una migrazione per creare lo Identity schema non è stata creata e applicata al database, creare una migrazione e aggiornare il database. Ad esempio, eseguire i comandi seguenti:

Nella console di Visual Studio Gestione pacchetti:

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

Il parametro del nome "CreaIdentityschema" per il Add-Migration comando è arbitrario. "CreateIdentitySchema" descrive la migrazione.

Se lo Identity schema è già stato creato ma non applicato al database, è necessario eseguire solo il comando per aggiornare il database:

Nella console di Visual Studio Gestione pacchetti eseguire Update-Database:

Update-Database

È possibile confermare l'applicazione di uno Identity schema con il comando seguente. L'output del comando include una colonna "applied" per mostrare quali migrazioni vengono applicate al database.

Nella console di Visual Studio Gestione pacchetti eseguire Get-Migration:

Get-Migration

Se esistono più contesti di database, specificare il contesto con il -Context parametro .

Modifiche al layout

Facoltativo: aggiungere l'account di accesso parziale (_LoginPartial) al file di layout:

<!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>

Eseguire lo scaffolding Identity in un Razor progetto con autorizzazione

Installare il pacchetto NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design .

Nota

Per indicazioni sull'aggiunta di pacchetti alle app .NET, vedere gli articoli sotto Installare e gestire pacchetti in Flusso di lavoro dell'utilizzo di pacchetti (documentazione di NuGet). Confermare le versioni corrette del pacchetto all'indirizzo NuGet.org.


Eseguire lo Identity scaffolder:

  • Da Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto >Aggiungi>nuovo elemento con scaffolding.
  • Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Identity. Selezionare Identity nel riquadro centrale. Seleziona il pulsante Aggiungi.
  • Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate.
    • Se si dispone di una pagina di layout personalizzata esistente per Identity (_Layout.cshtml), selezionare la pagina di layout esistente per evitare di sovrascrivere il layout con markup errato dallo scaffolder. Ad esempio, selezionare:
      • Pages/Shared/_Layout.cshtml per Razor Pagine o Blazor Server progetti con l'infrastruttura Pages esistente Razor .
      • Views/Shared/_Layout.cshtml per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
    • Per il contesto dati (classe DbContext):
      • Selezionare la classe del contesto dati. È necessario selezionare almeno un file per aggiungere il contesto dati.
      • Per creare un contesto dati ed eventualmente creare una nuova classe utente per Identity, selezionare il + pulsante . Accettare il valore predefinito o specificare una classe , Contoso.Data.ApplicationDbContext ad esempio per una società denominata "Contoso". Per creare una nuova classe utente, selezionare il + pulsante Per classe User e specificare la classe (ad esempio, ContosoUser per una società denominata "Contoso").
    • Selezionare il pulsante Aggiungi per eseguire lo scaffolder.

Eseguire lo scaffolding Identity in un progetto MVC senza autorizzazione esistente

Installare il pacchetto NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design .

Nota

Per indicazioni sull'aggiunta di pacchetti alle app .NET, vedere gli articoli sotto Installare e gestire pacchetti in Flusso di lavoro dell'utilizzo di pacchetti (documentazione di NuGet). Confermare le versioni corrette del pacchetto all'indirizzo NuGet.org.


Eseguire lo Identity scaffolder:

  • Da Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto >Aggiungi>nuovo elemento con scaffolding.
  • Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Identity. Selezionare Identity nel riquadro centrale. Seleziona il pulsante Aggiungi.
  • Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate.
    • Se si dispone di una pagina di layout personalizzata esistente per Identity (_Layout.cshtml), selezionare la pagina di layout esistente per evitare di sovrascrivere il layout con markup errato dallo scaffolder. Ad esempio, selezionare:
      • Pages/Shared/_Layout.cshtml per Razor Pagine o Blazor Server progetti con l'infrastruttura Pages esistente Razor .
      • Views/Shared/_Layout.cshtml per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
    • Per il contesto dati (classe DbContext):
      • Selezionare la classe del contesto dati. È necessario selezionare almeno un file per aggiungere il contesto dati.
      • Per creare un contesto dati ed eventualmente creare una nuova classe utente per Identity, selezionare il + pulsante . Accettare il valore predefinito o specificare una classe , Contoso.Data.ApplicationDbContext ad esempio per una società denominata "Contoso". Per creare una nuova classe utente, selezionare il + pulsante Per classe User e specificare la classe (ad esempio, ContosoUser per una società denominata "Contoso").
    • Selezionare il pulsante Aggiungi per eseguire lo scaffolder.

Facoltativo: aggiungere l'account di accesso parziale (_LoginPartial) al Views/Shared/_Layout.cshtml file:

<!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>

Il codice del database generato Identity richiede Migrazioni di Entity Framework Core. Se una migrazione per creare lo Identity schema non è stata creata e applicata al database, creare una migrazione e aggiornare il database. Ad esempio, eseguire i comandi seguenti:

Nella console di Visual Studio Gestione pacchetti:

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

Il parametro del nome "CreaIdentityschema" per il Add-Migration comando è arbitrario. "CreateIdentitySchema" descrive la migrazione.

Se lo Identity schema è già stato creato ma non applicato al database, è necessario eseguire solo il comando per aggiornare il database:

Nella console di Visual Studio Gestione pacchetti eseguire Update-Database:

Update-Database

È possibile confermare l'applicazione di uno Identity schema con il comando seguente. L'output del comando include una colonna "applied" per mostrare quali migrazioni vengono applicate al database.

Nella console di Visual Studio Gestione pacchetti eseguire Get-Migration:

Get-Migration

Se esistono più contesti di database, specificare il contesto con il -Context parametro .

Aggiungere MapRazorPages a Program.cs come illustrato nel codice evidenziato seguente:

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

Eseguire lo scaffolding Identity in un progetto MVC con autorizzazione

Installare il pacchetto NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design .

Nota

Per indicazioni sull'aggiunta di pacchetti alle app .NET, vedere gli articoli sotto Installare e gestire pacchetti in Flusso di lavoro dell'utilizzo di pacchetti (documentazione di NuGet). Confermare le versioni corrette del pacchetto all'indirizzo NuGet.org.


Eseguire lo Identity scaffolder:

  • Da Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto >Aggiungi>nuovo elemento con scaffolding.
  • Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Identity. Selezionare Identity nel riquadro centrale. Seleziona il pulsante Aggiungi.
  • Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate.
    • Se si dispone di una pagina di layout personalizzata esistente per Identity (_Layout.cshtml), selezionare la pagina di layout esistente per evitare di sovrascrivere il layout con markup errato dallo scaffolder. Ad esempio, selezionare:
      • Pages/Shared/_Layout.cshtml per Razor Pagine o Blazor Server progetti con l'infrastruttura Pages esistente Razor .
      • Views/Shared/_Layout.cshtml per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
    • Per il contesto dati (classe DbContext):
      • Selezionare la classe del contesto dati. È necessario selezionare almeno un file per aggiungere il contesto dati.
      • Per creare un contesto dati ed eventualmente creare una nuova classe utente per Identity, selezionare il + pulsante . Accettare il valore predefinito o specificare una classe , Contoso.Data.ApplicationDbContext ad esempio per una società denominata "Contoso". Per creare una nuova classe utente, selezionare il + pulsante Per classe User e specificare la classe (ad esempio, ContosoUser per una società denominata "Contoso").
    • Selezionare il pulsante Aggiungi per eseguire lo scaffolder.

Eseguire lo scaffolding Identity in un'app lato Blazor server con autorizzazione

Installare il pacchetto NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design .

Nota

Per indicazioni sull'aggiunta di pacchetti alle app .NET, vedere gli articoli sotto Installare e gestire pacchetti in Flusso di lavoro dell'utilizzo di pacchetti (documentazione di NuGet). Confermare le versioni corrette del pacchetto all'indirizzo NuGet.org.


Eseguire lo Identity scaffolder:

  • Da Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto >Aggiungi>nuovo elemento con scaffolding.
  • Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Identity. Selezionare Identity nel riquadro centrale. Seleziona il pulsante Aggiungi.
  • Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate.
    • Se si dispone di una pagina di layout personalizzata esistente per Identity (_Layout.cshtml), selezionare la pagina di layout esistente per evitare di sovrascrivere il layout con markup errato dallo scaffolder. Ad esempio, selezionare:
      • Pages/Shared/_Layout.cshtml per Razor Pagine o Blazor Server progetti con l'infrastruttura Pages esistente Razor .
      • Views/Shared/_Layout.cshtml per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
    • Per il contesto dati (classe DbContext):
      • Selezionare la classe del contesto dati. È necessario selezionare almeno un file per aggiungere il contesto dati.
      • Per creare un contesto dati ed eventualmente creare una nuova classe utente per Identity, selezionare il + pulsante . Accettare il valore predefinito o specificare una classe , Contoso.Data.ApplicationDbContext ad esempio per una società denominata "Contoso". Per creare una nuova classe utente, selezionare il + pulsante Per classe User e specificare la classe (ad esempio, ContosoUser per una società denominata "Contoso").
    • Selezionare il pulsante Aggiungi per eseguire lo scaffolder.

Migrazioni

Il codice del database generato Identity richiede Migrazioni di Entity Framework Core. Se una migrazione per creare lo Identity schema non è stata creata e applicata al database, creare una migrazione e aggiornare il database. Ad esempio, eseguire i comandi seguenti:

Nella console di Visual Studio Gestione pacchetti:

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

Il parametro del nome "CreaIdentityschema" per il Add-Migration comando è arbitrario. "CreateIdentitySchema" descrive la migrazione.

Se lo Identity schema è già stato creato ma non applicato al database, è necessario eseguire solo il comando per aggiornare il database:

Nella console di Visual Studio Gestione pacchetti eseguire Update-Database:

Update-Database

È possibile confermare l'applicazione di uno Identity schema con il comando seguente. L'output del comando include una colonna "applied" per mostrare quali migrazioni vengono applicate al database.

Nella console di Visual Studio Gestione pacchetti eseguire Get-Migration:

Get-Migration

Se esistono più contesti di database, specificare il contesto con il -Context parametro .

Endpoint di autenticazione di stile

Poiché le app lato Blazor server usano Razor le pagine Pages Identity , lo stile dell'interfaccia utente cambia quando un visitatore si sposta tra Identity pagine e componenti. Sono disponibili due opzioni per affrontare gli stili incongrui:

Componenti personalizzati Identity

ASP.NET Core Identity è progettato per funzionare nel contesto della comunicazione di richiesta e risposta HTTP, che non è il modello di comunicazione client-server primario nelle Blazor app. Le app ASP.NET Core che usano ASP.NET Core Identity per la gestione utenti devono usare Razor Pages anziché componenti Razor per l'interfaccia utente correlata a Identity, ad esempio registrazione utente, accesso, disconnessione e altre attività di gestione utenti.

Poiché SignInManager<TUser> e UserManager<TUser> non sono supportati nei Razor componenti, è consigliabile usare l'API Web per gestire Identity le azioni dai Razor componenti tramite un'app abilitata sul lato Identityserver ASP.NET Core. Per indicazioni sulla creazione di API Web per Blazor le app, vedere Chiamare un'API Web da un'app ASP.NET CoreBlazor.

Un approccio all'uso Razor dei componenti per Identity invece delle Razor pagine consiste nel creare componenti personalizzati IdentityRazor , ma Microsoft non consiglia o supporta l'approccio. Per un contesto aggiuntivo, esplorare le discussioni seguenti. Nelle discussioni seguenti, gli esempi di codice nei commenti sui problemi e gli esempi di codice collegati tra i repository GitHub non Microsoft non sono supportati da Microsoft, ma potrebbero essere utili per alcuni sviluppatori:

Per ulteriore assistenza quando si cerca di creare componenti personalizzati IdentityRazor o cercare componenti di terze parti Razor , è consigliabile usare le risorse seguenti:

Usare un layout personalizzato con Blazor gli stili dell'app

Il layout e gli stili delle Identity pagine possono essere modificati per produrre pagine che usano stili simili al tema predefinito Blazor . Questo approccio non è coperto dalla documentazione.

App lato Blazor client

Le app sul lato Blazor client usano approcci di interfaccia utente personalizzati Identity e non possono usare ASP.NET scaffolding core Identity . Le app principali ASP.NET lato server delle soluzioni ospitate Blazor possono seguire le Razor linee guida Pages/MVC in questo articolo e sono configurate esattamente come qualsiasi altro tipo di app ASP.NET Core che supporta Identity.

Il Blazor framework non include Razor le versioni dei componenti delle pagine dell'interfaccia Identity utente. Identity I componenti dell'interfaccia utente Razor possono essere creati o ottenuti da origini di terze parti non supportate.

Per altre informazioni, vedere gli Blazor articoli Sicurezza e Identity .

Creare un'origine completa Identity dell'interfaccia utente

Per mantenere il controllo completo dell'interfaccia Identity utente, eseguire lo Identity scaffolder e selezionare Sostituisci tutti i file.

Configurazione della password

Se PasswordOptions sono configurati in Startup.ConfigureServices, [StringLength] la configurazione dell'attributo potrebbe essere necessaria per la Password proprietà nelle pagine con scaffolding Identity . InputModelPassword Le proprietà sono disponibili nei file seguenti:

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

Disabilitare una pagina

Questa sezione illustra come disabilitare la pagina di registrazione, ma l'approccio può essere usato per disabilitare qualsiasi pagina.

Per disabilitare la registrazione utente:

  • Eseguire lo scaffolding Identitydi . Includere Account.Register, Account.Login e Account.RegisterConfirmation. Ad esempio:

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  • Aggiornare Areas/Identity/Pages/Account/Register.cshtml.cs in modo che gli utenti non possano eseguire la registrazione da questo endpoint:

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • Aggiornare Areas/Identity/Pages/Account/Register.cshtml in modo che sia coerente con le modifiche precedenti:

    @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>
    
  • Impostare come commento o rimuovere il collegamento di registrazione da Areas/Identity/Pages/Account/Login.cshtml

    @*
    <p>
        <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
    </p>
    *@
    
  • Aggiornare la pagina Aree//IdentityPagine/Account/RegisterConfirmation .

    • Rimuovere il codice e i collegamenti dal file cshtml.
    • Rimuovere il codice di conferma da PageModel:
    [AllowAnonymous]
      public class RegisterConfirmationModel : PageModel
      {
          public IActionResult OnGet()
          {  
              return Page();
          }
      }
    

Usare un'altra app per aggiungere utenti

Fornire un meccanismo per aggiungere utenti esterni all'app Web. Le opzioni per aggiungere utenti includono:

  • Un'app Web di amministrazione dedicata.
  • Un'app console.

Il codice seguente descrive un approccio all'aggiunta di utenti:

  • Un elenco di utenti viene letto in memoria.
  • Per ogni utente viene generata una password univoca complessa.
  • L'utente viene aggiunto al Identity database.
  • L'utente riceve una notifica e comunica di modificare la password.
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>();
            });
}

Il codice seguente descrive l'aggiunta di un utente:


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

È possibile seguire un approccio simile per gli scenari di produzione.

Impedire la pubblicazione di asset statici Identity

Per impedire la pubblicazione di asset statici Identity nella radice Web, vedere Introduzione a Identity in ASP.NET Core.

ASP.NET Core fornisce ASP.NET CoreIdentitycome libreria di Razor classi. Le applicazioni che includono Identity possono applicare lo scaffolder per aggiungere in modo selettivo il codice sorgente contenuto nella IdentityRazor libreria di classi (RCL). Se si vuole generare un codice sorgente, è possibile modificare il codice e modificarne il comportamento. Ad esempio, è possibile indicare allo scaffolder di generare il codice usato nella registrazione. Il codice generato ha la precedenza sullo stesso codice nell'RCL Identity . Per ottenere il controllo completo dell'interfaccia utente e non usare l'RCL predefinito, vedere la sezione Creare l'origine completa Identity dell'interfaccia utente.

Le applicazioni che non includono l'autenticazione possono applicare lo scaffolder per aggiungere il pacchetto RCL Identity . È possibile selezionare Identity il codice da generare.

Anche se lo scaffolder genera la maggior parte del codice necessario, è necessario aggiornare il progetto per completare il processo. Questo documento illustra i passaggi necessari per completare un Identity aggiornamento dello scaffolding.

È consigliabile usare un sistema di controllo del codice sorgente che mostra le differenze tra i file e consente di eseguire il backup delle modifiche. Esaminare le modifiche dopo l'esecuzione dello Identity scaffolder.

I servizi sono necessari quando si usano Two Factor Authentication, la conferma dell'account e il ripristino delle password e altre funzionalità di sicurezza con Identity. I servizi o gli stub del servizio non vengono generati durante lo scaffolding Identitydi . I servizi per abilitare queste funzionalità devono essere aggiunti manualmente. Ad esempio, vedere Richiedi conferma tramite posta elettronica.

Quando si esegue lo scaffolding Identity con un nuovo contesto dati in un progetto con singoli account esistenti:

  • In Startup.ConfigureServicesrimuovere le chiamate a:
    • AddDbContext
    • AddDefaultIdentity

Ad esempio, AddDbContext e AddDefaultIdentity sono commentati nel codice seguente:

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

Il codice precedente commenta il codice duplicato in Areas/Identity/IdentityHostingStartup.cs

In genere, le app create con singoli account non devono creare un nuovo contesto dati.

Eseguire lo scaffolding Identity in un progetto vuoto

Eseguire lo Identity scaffolder:

  • Da Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto >Aggiungi>nuovo elemento con scaffolding.
  • Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Identity. Selezionare Identity nel riquadro centrale. Seleziona il pulsante Aggiungi.
  • Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate.
    • Se si dispone di una pagina di layout personalizzata esistente per Identity (_Layout.cshtml), selezionare la pagina di layout esistente per evitare di sovrascrivere il layout con markup errato dallo scaffolder. Ad esempio, selezionare:
      • Pages/Shared/_Layout.cshtml per Razor Pagine o Blazor Server progetti con l'infrastruttura Pages esistente Razor .
      • Views/Shared/_Layout.cshtml per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
    • Per il contesto dati (classe DbContext):
      • Selezionare la classe del contesto dati. È necessario selezionare almeno un file per aggiungere il contesto dati.
      • Per creare un contesto dati ed eventualmente creare una nuova classe utente per Identity, selezionare il + pulsante . Accettare il valore predefinito o specificare una classe , Contoso.Data.ApplicationDbContext ad esempio per una società denominata "Contoso". Per creare una nuova classe utente, selezionare il + pulsante Per classe User e specificare la classe (ad esempio, ContosoUser per una società denominata "Contoso").
    • Selezionare il pulsante Aggiungi per eseguire lo scaffolder.

Aggiornare la Startup classe con codice simile al seguente:

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

UseHsts è consigliato ma non obbligatorio. Per altre informazioni, vedere HTTP Strict Transport Security Protocol.

Il codice del database generato Identity richiede Migrazioni di Entity Framework Core. Se una migrazione per creare lo Identity schema non è stata creata e applicata al database, creare una migrazione e aggiornare il database. Ad esempio, eseguire i comandi seguenti:

Nella console di Visual Studio Gestione pacchetti:

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

Il parametro del nome "CreaIdentityschema" per il Add-Migration comando è arbitrario. "CreateIdentitySchema" descrive la migrazione.

Se lo Identity schema è già stato creato ma non applicato al database, è necessario eseguire solo il comando per aggiornare il database:

Nella console di Visual Studio Gestione pacchetti eseguire Update-Database:

Update-Database

È possibile confermare l'applicazione di uno Identity schema con il comando seguente. L'output del comando include una colonna "applied" per mostrare quali migrazioni vengono applicate al database.

Nella console di Visual Studio Gestione pacchetti eseguire Get-Migration:

Get-Migration

Se esistono più contesti di database, specificare il contesto con il -Context parametro .

Eseguire lo scaffolding Identity in un Razor progetto senza autorizzazione esistente

Eseguire lo Identity scaffolder:

  • Da Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto >Aggiungi>nuovo elemento con scaffolding.
  • Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Identity. Selezionare Identity nel riquadro centrale. Seleziona il pulsante Aggiungi.
  • Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate.
    • Se si dispone di una pagina di layout personalizzata esistente per Identity (_Layout.cshtml), selezionare la pagina di layout esistente per evitare di sovrascrivere il layout con markup errato dallo scaffolder. Ad esempio, selezionare:
      • Pages/Shared/_Layout.cshtml per Razor Pagine o Blazor Server progetti con l'infrastruttura Pages esistente Razor .
      • Views/Shared/_Layout.cshtml per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
    • Per il contesto dati (classe DbContext):
      • Selezionare la classe del contesto dati. È necessario selezionare almeno un file per aggiungere il contesto dati.
      • Per creare un contesto dati ed eventualmente creare una nuova classe utente per Identity, selezionare il + pulsante . Accettare il valore predefinito o specificare una classe , Contoso.Data.ApplicationDbContext ad esempio per una società denominata "Contoso". Per creare una nuova classe utente, selezionare il + pulsante Per classe User e specificare la classe (ad esempio, ContosoUser per una società denominata "Contoso").
    • Selezionare il pulsante Aggiungi per eseguire lo scaffolder.

Identity è configurato in Areas/Identity/IdentityHostingStartup.cs. Per altre informazioni, vedere IHostingStartup.

Migrazioni, UseAuthentication e layout

Il codice del database generato Identity richiede Migrazioni di Entity Framework Core. Se una migrazione per creare lo Identity schema non è stata creata e applicata al database, creare una migrazione e aggiornare il database. Ad esempio, eseguire i comandi seguenti:

Nella console di Visual Studio Gestione pacchetti:

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

Il parametro del nome "CreaIdentityschema" per il Add-Migration comando è arbitrario. "CreateIdentitySchema" descrive la migrazione.

Se lo Identity schema è già stato creato ma non applicato al database, è necessario eseguire solo il comando per aggiornare il database:

Nella console di Visual Studio Gestione pacchetti eseguire Update-Database:

Update-Database

È possibile confermare l'applicazione di uno Identity schema con il comando seguente. L'output del comando include una colonna "applied" per mostrare quali migrazioni vengono applicate al database.

Nella console di Visual Studio Gestione pacchetti eseguire Get-Migration:

Get-Migration

Se esistono più contesti di database, specificare il contesto con il -Context parametro .

Abilita autenticazione

Aggiornare la Startup classe con codice simile al seguente:

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

UseHsts è consigliato ma non obbligatorio. Per altre informazioni, vedere HTTP Strict Transport Security Protocol.

Modifiche al layout

Facoltativo: aggiungere l'account di accesso parziale (_LoginPartial) al file di layout:

<!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>

Eseguire lo scaffolding Identity in un Razor progetto con autorizzazione

Eseguire lo Identity scaffolder:

  • Da Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto >Aggiungi>nuovo elemento con scaffolding.
  • Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Identity. Selezionare Identity nel riquadro centrale. Seleziona il pulsante Aggiungi.
  • Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate.
    • Se si dispone di una pagina di layout personalizzata esistente per Identity (_Layout.cshtml), selezionare la pagina di layout esistente per evitare di sovrascrivere il layout con markup errato dallo scaffolder. Ad esempio, selezionare:
      • Pages/Shared/_Layout.cshtml per Razor Pagine o Blazor Server progetti con l'infrastruttura Pages esistente Razor .
      • Views/Shared/_Layout.cshtml per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
    • Per il contesto dati (classe DbContext):
      • Selezionare la classe del contesto dati. È necessario selezionare almeno un file per aggiungere il contesto dati.
      • Per creare un contesto dati ed eventualmente creare una nuova classe utente per Identity, selezionare il + pulsante . Accettare il valore predefinito o specificare una classe , Contoso.Data.ApplicationDbContext ad esempio per una società denominata "Contoso". Per creare una nuova classe utente, selezionare il + pulsante Per classe User e specificare la classe (ad esempio, ContosoUser per una società denominata "Contoso").
    • Selezionare il pulsante Aggiungi per eseguire lo scaffolder.

Alcune Identity opzioni sono configurate in Areas/Identity/IdentityHostingStartup.cs. Per altre informazioni, vedere IHostingStartup.

Eseguire lo scaffolding Identity in un progetto MVC senza autorizzazione esistente

Eseguire lo Identity scaffolder:

  • Da Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto >Aggiungi>nuovo elemento con scaffolding.
  • Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Identity. Selezionare Identity nel riquadro centrale. Seleziona il pulsante Aggiungi.
  • Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate.
    • Se si dispone di una pagina di layout personalizzata esistente per Identity (_Layout.cshtml), selezionare la pagina di layout esistente per evitare di sovrascrivere il layout con markup errato dallo scaffolder. Ad esempio, selezionare:
      • Pages/Shared/_Layout.cshtml per Razor Pagine o Blazor Server progetti con l'infrastruttura Pages esistente Razor .
      • Views/Shared/_Layout.cshtml per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
    • Per il contesto dati (classe DbContext):
      • Selezionare la classe del contesto dati. È necessario selezionare almeno un file per aggiungere il contesto dati.
      • Per creare un contesto dati ed eventualmente creare una nuova classe utente per Identity, selezionare il + pulsante . Accettare il valore predefinito o specificare una classe , Contoso.Data.ApplicationDbContext ad esempio per una società denominata "Contoso". Per creare una nuova classe utente, selezionare il + pulsante Per classe User e specificare la classe (ad esempio, ContosoUser per una società denominata "Contoso").
    • Selezionare il pulsante Aggiungi per eseguire lo scaffolder.

Facoltativo: aggiungere l'account di accesso parziale (_LoginPartial) al Views/Shared/_Layout.cshtml file:

<!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>
  • Spostare il Pages/Shared/_LoginPartial.cshtml file in Views/Shared/_LoginPartial.cshtml

Identity è configurato in Areas/Identity/IdentityHostingStartup.cs. Per altre informazioni, vedere IHostingStartup.

Il codice del database generato Identity richiede Migrazioni di Entity Framework Core. Se una migrazione per creare lo Identity schema non è stata creata e applicata al database, creare una migrazione e aggiornare il database. Ad esempio, eseguire i comandi seguenti:

Nella console di Visual Studio Gestione pacchetti:

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

Il parametro del nome "CreaIdentityschema" per il Add-Migration comando è arbitrario. "CreateIdentitySchema" descrive la migrazione.

Se lo Identity schema è già stato creato ma non applicato al database, è necessario eseguire solo il comando per aggiornare il database:

Nella console di Visual Studio Gestione pacchetti eseguire Update-Database:

Update-Database

È possibile confermare l'applicazione di uno Identity schema con il comando seguente. L'output del comando include una colonna "applied" per mostrare quali migrazioni vengono applicate al database.

Nella console di Visual Studio Gestione pacchetti eseguire Get-Migration:

Get-Migration

Se esistono più contesti di database, specificare il contesto con il -Context parametro .

Aggiornare la Startup classe con codice simile al seguente:

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

UseHsts è consigliato ma non obbligatorio. Per altre informazioni, vedere HTTP Strict Transport Security Protocol.

Eseguire lo scaffolding Identity in un progetto MVC con autorizzazione

Eseguire lo Identity scaffolder:

  • Da Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto >Aggiungi>nuovo elemento con scaffolding.
  • Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Identity. Selezionare Identity nel riquadro centrale. Seleziona il pulsante Aggiungi.
  • Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate.
    • Se si dispone di una pagina di layout personalizzata esistente per Identity (_Layout.cshtml), selezionare la pagina di layout esistente per evitare di sovrascrivere il layout con markup errato dallo scaffolder. Ad esempio, selezionare:
      • Pages/Shared/_Layout.cshtml per Razor Pagine o Blazor Server progetti con l'infrastruttura Pages esistente Razor .
      • Views/Shared/_Layout.cshtml per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
    • Per il contesto dati (classe DbContext):
      • Selezionare la classe del contesto dati. È necessario selezionare almeno un file per aggiungere il contesto dati.
      • Per creare un contesto dati ed eventualmente creare una nuova classe utente per Identity, selezionare il + pulsante . Accettare il valore predefinito o specificare una classe , Contoso.Data.ApplicationDbContext ad esempio per una società denominata "Contoso". Per creare una nuova classe utente, selezionare il + pulsante Per classe User e specificare la classe (ad esempio, ContosoUser per una società denominata "Contoso").
    • Selezionare il pulsante Aggiungi per eseguire lo scaffolder.

Eseguire lo scaffolding Identity in un'app lato Blazor server senza autorizzazione esistente

Eseguire lo Identity scaffolder:

  • Da Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto >Aggiungi>nuovo elemento con scaffolding.
  • Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Identity. Selezionare Identity nel riquadro centrale. Seleziona il pulsante Aggiungi.
  • Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate.
    • Se si dispone di una pagina di layout personalizzata esistente per Identity (_Layout.cshtml), selezionare la pagina di layout esistente per evitare di sovrascrivere il layout con markup errato dallo scaffolder. Ad esempio, selezionare:
      • Pages/Shared/_Layout.cshtml per Razor Pagine o Blazor Server progetti con l'infrastruttura Pages esistente Razor .
      • Views/Shared/_Layout.cshtml per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
    • Per il contesto dati (classe DbContext):
      • Selezionare la classe del contesto dati. È necessario selezionare almeno un file per aggiungere il contesto dati.
      • Per creare un contesto dati ed eventualmente creare una nuova classe utente per Identity, selezionare il + pulsante . Accettare il valore predefinito o specificare una classe , Contoso.Data.ApplicationDbContext ad esempio per una società denominata "Contoso". Per creare una nuova classe utente, selezionare il + pulsante Per classe User e specificare la classe (ad esempio, ContosoUser per una società denominata "Contoso").
    • Selezionare il pulsante Aggiungi per eseguire lo scaffolder.

Identity è configurato in Areas/Identity/IdentityHostingStartup.cs. Per ulteriori informazioni, vedere IHostingStartup.

Migrazioni

Il codice del database generato Identity richiede Migrazioni di Entity Framework Core. Se una migrazione per creare lo Identity schema non è stata creata e applicata al database, creare una migrazione e aggiornare il database. Ad esempio, eseguire i comandi seguenti:

Nella console di Visual Studio Gestione pacchetti:

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

Il parametro del nome "CreaIdentityschema" per il Add-Migration comando è arbitrario. "CreateIdentitySchema" descrive la migrazione.

Se lo Identity schema è già stato creato ma non applicato al database, è necessario eseguire solo il comando per aggiornare il database:

Nella console di Visual Studio Gestione pacchetti eseguire Update-Database:

Update-Database

È possibile confermare l'applicazione di uno Identity schema con il comando seguente. L'output del comando include una colonna "applied" per mostrare quali migrazioni vengono applicate al database.

Nella console di Visual Studio Gestione pacchetti eseguire Get-Migration:

Get-Migration

Se esistono più contesti di database, specificare il contesto con il -Context parametro .

Endpoint di autenticazione di stile

Poiché le app lato Blazor server usano Razor le pagine Pages Identity , lo stile dell'interfaccia utente cambia quando un visitatore si sposta tra Identity pagine e componenti. Sono disponibili due opzioni per affrontare gli stili incongrui:

Componenti personalizzati Identity

Un approccio all'uso dei componenti per Identity invece delle pagine consiste nel creare Identity componenti. Poiché SignInManager e UserManager non sono supportati nei Razor componenti, usare gli endpoint API Web nell'app Blazor per elaborare le azioni dell'account utente.

Usare un layout personalizzato con Blazor gli stili dell'app

Il layout e gli stili delle Identity pagine possono essere modificati per produrre pagine che usano stili simili al tema predefinito Blazor . Questo approccio non è coperto dalla documentazione.

Eseguire lo scaffolding Identity in un'app lato Blazor server con autorizzazione

Eseguire lo Identity scaffolder:

  • Da Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto >Aggiungi>nuovo elemento con scaffolding.
  • Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Identity. Selezionare Identity nel riquadro centrale. Seleziona il pulsante Aggiungi.
  • Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate.
    • Se si dispone di una pagina di layout personalizzata esistente per Identity (_Layout.cshtml), selezionare la pagina di layout esistente per evitare di sovrascrivere il layout con markup errato dallo scaffolder. Ad esempio, selezionare:
      • Pages/Shared/_Layout.cshtml per Razor Pagine o Blazor Server progetti con l'infrastruttura Pages esistente Razor .
      • Views/Shared/_Layout.cshtml per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
    • Per il contesto dati (classe DbContext):
      • Selezionare la classe del contesto dati. È necessario selezionare almeno un file per aggiungere il contesto dati.
      • Per creare un contesto dati ed eventualmente creare una nuova classe utente per Identity, selezionare il + pulsante . Accettare il valore predefinito o specificare una classe , Contoso.Data.ApplicationDbContext ad esempio per una società denominata "Contoso". Per creare una nuova classe utente, selezionare il + pulsante Per classe User e specificare la classe (ad esempio, ContosoUser per una società denominata "Contoso").
    • Selezionare il pulsante Aggiungi per eseguire lo scaffolder.

Alcune Identity opzioni sono configurate in Areas/Identity/IdentityHostingStartup.cs. Per altre informazioni, vedere IHostingStartup.

App lato Blazor client

Le app sul lato Blazor client usano approcci di interfaccia utente personalizzati Identity e non possono usare ASP.NET scaffolding core Identity . Le app principali ASP.NET lato server delle soluzioni ospitate Blazor possono seguire le Razor linee guida Pages/MVC in questo articolo e sono configurate esattamente come qualsiasi altro tipo di app ASP.NET Core che supporta Identity.

Il Blazor framework non include Razor le versioni dei componenti delle pagine dell'interfaccia Identity utente. Identity I componenti dell'interfaccia utente Razor possono essere creati o ottenuti da origini di terze parti non supportate.

Per altre informazioni, vedere gli Blazor articoli Sicurezza e Identity .

Creare un'origine completa Identity dell'interfaccia utente

Per mantenere il controllo completo dell'interfaccia Identity utente, eseguire lo Identity scaffolder e selezionare Sostituisci tutti i file.

Il codice evidenziato seguente mostra le modifiche per sostituire l'interfaccia utente predefinita Identity con Identity in un'app Web ASP.NET Core 2.1. Potrebbe essere necessario eseguire questa operazione per avere il controllo completo dell'interfaccia Identity utente.

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

Il valore predefinito Identity viene sostituito nel codice seguente:

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

Il codice seguente imposta LoginPath, LogoutPathe AccessDeniedPath:

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

Registrare un'implementazione IEmailSender , ad esempio:

// 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;
    }
}

Configurazione della password

Se PasswordOptions sono configurati in Startup.ConfigureServices, [StringLength] la configurazione dell'attributo potrebbe essere necessaria per la Password proprietà nelle pagine con scaffolding Identity . InputModelPassword Le proprietà sono disponibili nei file seguenti:

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

Disabilitare una pagina

Questa sezione illustra come disabilitare la pagina di registrazione, ma l'approccio può essere usato per disabilitare qualsiasi pagina.

Per disabilitare la registrazione utente:

  • Eseguire lo scaffolding Identitydi . Includere Account.Register, Account.Login e Account.RegisterConfirmation. Ad esempio:

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  • Aggiornare Areas/Identity/Pages/Account/Register.cshtml.cs in modo che gli utenti non possano eseguire la registrazione da questo endpoint:

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • Aggiornare Areas/Identity/Pages/Account/Register.cshtml in modo che sia coerente con le modifiche precedenti:

    @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>
    
  • Impostare come commento o rimuovere il collegamento di registrazione da Areas/Identity/Pages/Account/Login.cshtml

    @*
    <p>
        <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
    </p>
    *@
    
  • Aggiornare la pagina Aree//IdentityPagine/Account/RegisterConfirmation .

    • Rimuovere il codice e i collegamenti dal file cshtml.
    • Rimuovere il codice di conferma da PageModel:
    [AllowAnonymous]
      public class RegisterConfirmationModel : PageModel
      {
          public IActionResult OnGet()
          {  
              return Page();
          }
      }
    

Usare un'altra app per aggiungere utenti

Fornire un meccanismo per aggiungere utenti esterni all'app Web. Le opzioni per aggiungere utenti includono:

  • Un'app Web di amministrazione dedicata.
  • Un'app console.

Il codice seguente descrive un approccio all'aggiunta di utenti:

  • Un elenco di utenti viene letto in memoria.
  • Per ogni utente viene generata una password univoca complessa.
  • L'utente viene aggiunto al Identity database.
  • L'utente riceve una notifica e comunica di modificare la password.
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>();
            });
}

Il codice seguente descrive l'aggiunta di un utente:


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

È possibile seguire un approccio simile per gli scenari di produzione.

Impedire la pubblicazione di asset statici Identity

Per impedire la pubblicazione di asset statici Identity nella radice Web, vedere Introduzione a Identity in ASP.NET Core.

Risorse aggiuntive