Creare scaffolding Identity nei progetti ASP.NET Core

Di Rick Anderson

Questo articolo illustra come migrare un database e completare l'aggiornamento di Identity scaffolding.

Blazor Identity impalcatura

ASP.NET Core Identity scaffolding aggiunge ASP.NET Core Identity a Blazor Web App e alle app Blazor Server. Dopo che lo scaffolder aggiunge i IdentityRazor componenti all'app, è possibile personalizzare i componenti in base ai requisiti dell'applicazione.

Anche se lo scaffolder genera il codice C# necessario per eseguire lo scaffolding Identity nell'app, è necessario aggiornare il database di progetto con una migrazione del database Entity Framework Core per completare il processo. Questo articolo descrive i passaggi per la migrazione di un database.

Dopo aver eseguito lo Identity scaffolder, esaminare le modifiche. Usare GitHub o un altro sistema di controllo del codice sorgente che mostra le modifiche apportate ai file con una funzionalità di ripristino delle modifiche.

I servizi sono necessari quando si usa l'autenticazione a due fattori (2FA), la conferma dell'account e il ripristino delle password e altre funzionalità di sicurezza con Identity. I servizi o gli stub di servizio non vengono generati quando si esegue lo scaffolding Identity. I servizi per abilitare queste funzionalità devono essere aggiunti manualmente.

RazorScaffolding di pagine e MVC Identity

ASP.NET Core fornisce ASP.NET Core Identity come Razorlibreria di classi (RCL). Le applicazioni che includono Identity possono applicare lo scaffolder per aggiungere in modo selettivo il codice sorgente contenuto nell'RCL Identity . 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 personalizzato Identity esegue l'override dell'implementazione predefinita fornita dall'RCL Identity . Per ottenere il controllo completo dell'interfaccia utente e non usare la libreria RCL predefinita, vedere la sezione Creare Identity un'origine completa dell'interfaccia utente.

Le applicazioni che non includono l'autenticazione possono usare 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 articolo illustra i passaggi necessari per completare un aggiornamento dello Identity scaffolding. Dopo aver eseguito lo Identity scaffolder, esaminare le modifiche. Usare un sistema di controllo del codice sorgente che mostra le differenze tra file e consente di eseguire il backup delle modifiche.

I servizi sono necessari quando si usa 2FA, la conferma dell'account e il ripristino delle password e altre funzionalità di sicurezza con Identity. I servizi o gli stub di servizio non vengono generati quando si esegue lo scaffolding Identity. I servizi per abilitare queste funzionalità devono essere aggiunti manualmente. Ad esempio, vedere Configurare un provider di posta elettronica in modo che l'app possa richiedere la conferma tramite posta elettronica.

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

Aggiungere Identity in un progetto Blazor

Le procedure di scaffolding descritte in questa sezione si applicano a Blazor Web Apps e alle app Blazor Server.

Eseguire lo Identity scaffolder:

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e selezionare Add>New Scaffolded Item.

  2. Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding, seleziona Identity.

  3. Nel riquadro centrale selezionare Blazor Identitye quindi aggiungi.

  4. Nella finestra di dialogo Aggiungi BlazorIdentity :

    1. Selezionare l'icona con il segno più (+) e aggiungere la classe di contesto del database DbContext.

    2. Selezionare il provider di database (provider di database), che per impostazione predefinita è SQL Server.

    3. Selezionare l'icona con il segno più (+) e aggiungere la classe utente User.

    4. Seleziona Aggiungi.

Il codice di database Identity generato richiede Entity Framework Core Migrations. La procedura seguente illustra come creare e applicare una migrazione al database.

I Servizi connessi di Visual Studio si usano per aggiungere una migrazione di Entity Framework Core e aggiornare il database.

  1. In Esplora soluzioni fare doppio clic su Servizi connessi.

  2. Nell'area SQL Server Express LocalDB di Dipendenze del servizio, seleziona Altre azioni (...) >Aggiungi migrazione.

  3. Assegnare alla migrazione un nome di migrazione, ad esempio CreateIdentitySchema, che è un nome che descrive la migrazione.

    Attendere il caricamento del contesto del database nel campo Nomi delle classi DbContext. L'azione può richiedere alcuni secondi.

  4. Selezionare Fine per completare l'aggiornamento. Al termine dell'operazione, selezionare Chiudi.

  5. Selezionare Altre azioni (...) >Aggiornare il database.

    Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente.

    Attendere che i nomi delle classi DbContext vengano aggiornati e che vengano caricate le migrazioni precedenti. L'azione può richiedere alcuni secondi.

  6. Selezionare Fine per completare l'aggiornamento. Al termine dell'operazione, selezionare Chiudi.

Il comando update database esegue le migrazioni del Up metodo che non vengono applicate in un file di codice di migrazione creato dallo scaffolder. In questo caso, il comando esegue il Up metodo in Migrations/{TIME STAMP}_{MIGRATION NAME}.cs file, che crea tabelle Identity , vincoli e indici. Il segnaposto {TIME STAMP} è un timestamp e il segnaposto {MIGRATION NAME} è il nome della migrazione.

App sul lato Blazor client (Standalone Blazor WebAssembly)

Le app lato client Blazor (Standalone Blazor WebAssembly) usano approcci propri per l'interfaccia utente Identity e non possono usare lo scaffolding di ASP.NET Core Identity.

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

Generare Identity in un progetto Razor senza autorizzazione configurata

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

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.


Esegui il Identity generatore di scaffolding seguendo la procedura seguente.

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e selezionare Add>New Scaffolded Item.

  2. Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding, seleziona Identity.

  3. Nel riquadro centrale selezionare Identitye quindi aggiungi.

  4. Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate:

    1. Se si dispone di una pagina di layout personalizzata esistente per Identity (_Layout.cshtml), selezionare la pagina esistente per evitare di sovrascrivere il layout con markup non corretto dallo scaffolder. Ad esempio, selezionare:

      • Pages/Shared/_Layout.cshtml per Razor Pages o Blazor Server progetti con un'infrastruttura Razor Pages esistente.
      • Views/Shared/_Layout.cshtml per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
    2. Selezionare l'icona con il segno più (+) e aggiungere la classe di contesto del database DbContext. È necessario selezionare almeno un file per aggiungere il contesto dati.

      • Per creare un contesto dati, selezionare l'icona con il segno più (+). Accettare il valore predefinito o specificare una nuova classe per Identity.

      • Per creare una nuova classe utente, selezionare l'icona più (+) per Classe utente e specificare la classe (ad esempio, ContosoUser per una società denominata "Contoso").

    3. Selezionare Aggiungi per eseguire lo scaffolder.

Migrazioni, UseAuthentication e il layout

Il codice di database Identity generato richiede Entity Framework Core Migrations. Se una migrazione per generare lo Identity schema non è già stata creata e applicata al database, utilizzare le procedure seguenti per creare una migrazione e aggiornare il database.

I servizi connessi di Visual Studio vengono usati per aggiungere una EF Core migrazione e aggiornare il database.

  1. In Esplora soluzioni fare doppio clic su Servizi connessi.

  2. Nell'area SQL Server Express LocalDB di Servizi selezionare Azioni aggiuntive (... ) >Aggiungi migrazione.

  3. Assegnare alla migrazione un nome di migrazione, ad esempio CreateIdentitySchema, che è un nome che descrive la migrazione.

    Attendere il caricamento del contesto del database nel campo Nomi delle classi DbContext. L'azione può richiedere alcuni secondi.

  4. Selezionare Fine per completare l'aggiornamento. Al termine dell'operazione, selezionare Chiudi.

  5. Selezionare Altre azioni (...) >Aggiornare il database.

    Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente.

    Attendere che i nomi delle classi DbContext vengano aggiornati e che vengano caricate le migrazioni precedenti. L'azione può richiedere alcuni secondi.

  6. Selezionare Fine per completare l'aggiornamento. Al termine dell'operazione, selezionare Chiudi.

Il comando update database esegue le migrazioni del Up metodo che non vengono applicate in un file di codice di migrazione creato dallo scaffolder. In questo caso, il comando esegue il Up metodo in Migrations/{TIME STAMP}_{MIGRATION NAME}.cs file, che crea tabelle Identity , vincoli e indici. Il segnaposto {TIME STAMP} è un timestamp e il segnaposto {MIGRATION NAME} è il nome della migrazione.

Se lo Identity schema viene creato ma non applicato al database, è sufficiente eseguire il comando per aggiornare il database:

  1. In Esplora soluzioni fare doppio clic su Servizi connessi.

  2. Nell'area SQL Server Express LocalDB di Servizi selezionare Azioni aggiuntive (... ) >Update database.

    Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente.

    Attendere che i nomi delle classi DbContext vengano aggiornati e che vengano caricate le migrazioni precedenti. L'azione può richiedere alcuni secondi.

  3. Selezionare Fine per completare l'aggiornamento. Al termine dell'operazione, selezionare Chiudi.

È 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 Visual Studio Gestione pacchetti Console eseguire il comando Get-Migration:

Get-Migration

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

Modifiche al layout

Facoltativamente, è possibile aggiungere il partial di accesso (_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>

Creare Identity in un progetto Razor con autorizzazione

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

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.


Esegui il Identity generatore di scaffolding seguendo la procedura seguente.

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e selezionare Add>New Scaffolded Item.

  2. Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding, seleziona Identity.

  3. Nel riquadro centrale selezionare Identitye quindi aggiungi.

  4. Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate:

    1. Se si dispone di una pagina di layout personalizzata esistente per Identity (_Layout.cshtml), selezionare la pagina esistente per evitare di sovrascrivere il layout con markup non corretto dallo scaffolder. Ad esempio, selezionare:

      • Pages/Shared/_Layout.cshtml per Razor Pages o Blazor Server progetti con un'infrastruttura Razor Pages esistente.
      • Views/Shared/_Layout.cshtml per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
    2. Selezionare l'icona con il segno più (+) e aggiungere la classe di contesto del database DbContext. È necessario selezionare almeno un file per aggiungere il contesto dati.

      • Per creare un contesto dati, selezionare l'icona con il segno più (+). 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 l'icona più (+) per Classe utente e specificare la classe (ad esempio, ContosoUser per una società denominata "Contoso").

    3. Selezionare Aggiungi per eseguire lo scaffolder.

Eseguire lo scaffolding Identity in un progetto MVC senza autorizzazione esistente

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

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.


Esegui il Identity generatore di scaffolding seguendo la procedura seguente.

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e selezionare Add>New Scaffolded Item.

  2. Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding, seleziona Identity.

  3. Nel riquadro centrale selezionare Identitye quindi aggiungi.

  4. Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate:

    1. Se si dispone di una pagina di layout personalizzata esistente per Identity (_Layout.cshtml), selezionare la pagina esistente per evitare di sovrascrivere il layout con markup non corretto dallo scaffolder. Ad esempio, selezionare:

      • Pages/Shared/_Layout.cshtml per Razor Pages o Blazor Server progetti con un'infrastruttura Razor Pages esistente.
      • Views/Shared/_Layout.cshtml per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
    2. Selezionare l'icona con il segno più (+) e aggiungere la classe di contesto del database DbContext. È necessario selezionare almeno un file per aggiungere il contesto dati.

      • Per creare un contesto dati, selezionare l'icona con il segno più (+). Accettare il valore predefinito o specificare una nuova classe per Identity.

      • Per creare una nuova classe utente, selezionare l'icona più (+) per Classe utente e specificare la classe (ad esempio, ContosoUser per una società denominata "Contoso").

    3. Selezionare Aggiungi per eseguire lo scaffolder.

Facoltativo: aggiungi il parziale di accesso (_LoginPartial) al file 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>

Il codice di database Identity generato richiede Entity Framework Core Migrations. Se una migrazione per generare lo Identity schema non è già stata creata e applicata al database, utilizzare le procedure seguenti per creare una migrazione e aggiornare il database.

I servizi connessi di Visual Studio vengono usati per aggiungere una EF Core migrazione e aggiornare il database.

  1. In Esplora soluzioni fare doppio clic su Servizi connessi.

  2. Nell'area SQL Server Express LocalDB di Servizi selezionare Azioni aggiuntive (... ) >Aggiungi migrazione.

  3. Assegnare alla migrazione un nome di migrazione, ad esempio CreateIdentitySchema, che è un nome che descrive la migrazione.

    Attendere il caricamento del contesto del database nel campo Nomi delle classi DbContext. L'azione può richiedere alcuni secondi.

  4. Selezionare Fine per completare l'aggiornamento. Al termine dell'operazione, selezionare Chiudi.

  5. Selezionare Altre azioni (...) >Aggiornare il database.

    Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente.

    Attendere che i nomi delle classi DbContext vengano aggiornati e che vengano caricate le migrazioni precedenti. L'azione può richiedere alcuni secondi.

  6. Selezionare Fine per completare l'aggiornamento. Al termine dell'operazione, selezionare Chiudi.

Il comando update database esegue le migrazioni del Up metodo che non vengono applicate in un file di codice di migrazione creato dallo scaffolder. In questo caso, il comando esegue il Up metodo in Migrations/{TIME STAMP}_{MIGRATION NAME}.cs file, che crea tabelle Identity , vincoli e indici. Il segnaposto {TIME STAMP} è un timestamp e il segnaposto {MIGRATION NAME} è il nome della migrazione.

Se lo Identity schema viene creato ma non applicato al database, è sufficiente eseguire il comando per aggiornare il database:

  1. In Esplora soluzioni fare doppio clic su Servizi connessi.

  2. Nell'area SQL Server Express LocalDB di Servizi selezionare Azioni aggiuntive (... ) >Update database.

    Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente.

    Attendere che i nomi delle classi DbContext vengano aggiornati e che vengano caricate le migrazioni precedenti. L'azione può richiedere alcuni secondi.

  3. Selezionare Fine per completare l'aggiornamento. Al termine dell'operazione, selezionare Chiudi.

È 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 Visual Studio Gestione pacchetti Console eseguire il comando Get-Migration:

Get-Migration

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

Aggiungere MapRazorPages al file 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 Microsoft. VisualStudio.Web.CodeGeneration.Design pacchetto NuGet.

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.


Esegui il Identity generatore di scaffolding seguendo la procedura seguente.

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e selezionare Add>New Scaffolded Item.

  2. Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding, seleziona Identity.

  3. Nel riquadro centrale selezionare Identitye quindi aggiungi.

  4. Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate:

    1. Se si dispone di una pagina di layout personalizzata esistente per Identity (_Layout.cshtml), selezionare la pagina esistente per evitare di sovrascrivere il layout con markup non corretto dallo scaffolder. Ad esempio, selezionare:

      • Pages/Shared/_Layout.cshtml per Razor Pages o Blazor Server progetti con un'infrastruttura Razor Pages esistente.
      • Views/Shared/_Layout.cshtml per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
    2. Selezionare l'icona con il segno più (+) e aggiungere la classe di contesto del database DbContext. È necessario selezionare almeno un file per aggiungere il contesto dati.

      • Per creare un contesto dati, selezionare l'icona con il segno più (+). 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 l'icona più (+) per Classe utente e specificare la classe (ad esempio, ContosoUser per una società denominata "Contoso").

    3. Selezionare Aggiungi per eseguire lo scaffolder.

Creare il codice sorgente completo 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 vengono configurati in Startup.ConfigureServices, la configurazione StringLengthAttribute potrebbe essere necessaria per la proprietà Password nelle pagine Identity generate tramite scaffolding. Il InputModel e le relative proprietà Password si trovano nei file seguenti:

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

Disabilitare una pagina

Questa sezione descrive come disabilitare la pagina di registrazione, ma è possibile usare lo stesso approccio per disabilitare qualsiasi pagina.

Per disabilitare la registrazione utente:

  1. Eseguire lo scaffolding Identitydi . Includi Account.Register, Account.Login e Account.RegisterConfirmation. Ad esempio:

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  2. Aggiornare il file 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");
        }
    }
    
  3. Aggiornare il file 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>
    
  4. Commentare o rimuovere il link di registrazione dal file Areas/Identity/Pages/Account/Login.cshtml:

    @*
    <p>
        <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
    </p>
    *@
    
  5. Aggiornare la Areas/Identity/Pages/Account/RegisterConfirmation pagina.

    • Rimuovere il codice e i collegamenti dal file con estensione cshtml .

    • Rimuovere il codice di conferma dall'implementazione 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 da console

Il codice seguente descrive un approccio per l'aggiunta di utenti:

  • Caricare in memoria l'elenco degli utenti.
  • Generare una password univoca complessa per ogni utente.
  • Aggiungere l'utente al Identity database.
  • Notificare all'utente la modifica della 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 Core Identity come Razorlibreria di classi (RCL). Le applicazioni che includono Identity possono applicare lo scaffolder per aggiungere in modo selettivo il codice sorgente contenuto nell'RCL Identity . 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 senza usare l'RCL predefinito, consulta la sezione Creare il codice sorgente completo dell'Identityinterfaccia utente.

Le applicazioni che non includono l'autenticazione possono usare 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 di servizio non vengono generati quando si esegue lo scaffolding Identity. I servizi per abilitare queste funzionalità devono essere aggiunti manualmente. Ad esempio, vedere Richiedi conferma tramite posta elettronica.

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

Generare Identity in un progetto Razor senza autorizzazione configurata

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

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.


Esegui il Identity generatore di scaffolding seguendo la procedura seguente.

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e selezionare Add>New Scaffolded Item.

  2. Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding, seleziona Identity.

  3. Nel riquadro centrale selezionare Identitye quindi aggiungi.

  4. Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate:

    1. Se si dispone di una pagina di layout personalizzata esistente per Identity (_Layout.cshtml), selezionare la pagina esistente per evitare di sovrascrivere il layout con markup non corretto dallo scaffolder. Ad esempio, selezionare:

      • Pages/Shared/_Layout.cshtml per Razor Pages o Blazor Server progetti con un'infrastruttura Razor Pages esistente.
      • Views/Shared/_Layout.cshtml per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
    2. Selezionare l'icona con il segno più (+) e aggiungere la classe di contesto del database DbContext. È necessario selezionare almeno un file per aggiungere il contesto dati.

      • Per creare un contesto dati, selezionare l'icona con il segno più (+). Accettare il valore predefinito o specificare una nuova classe per Identity.

      • Per creare una nuova classe utente, selezionare l'icona più (+) per Classe utente e specificare la classe (ad esempio, ContosoUser per una società denominata "Contoso").

    3. Selezionare Aggiungi per eseguire lo scaffolder.

Migrazioni, UseAuthentication e il layout

Il codice di database Identity generato richiede Entity Framework Core Migrations. Se una migrazione per generare lo Identity schema non è già stata creata e applicata al database, utilizzare le procedure seguenti per creare una migrazione e aggiornare il database.

I servizi connessi di Visual Studio vengono usati per aggiungere una EF Core migrazione e aggiornare il database.

  1. In Esplora soluzioni fare doppio clic su Servizi connessi.

  2. Nell'area SQL Server Express LocalDB di Servizi selezionare Azioni aggiuntive (... ) >Aggiungi migrazione.

  3. Assegnare alla migrazione un nome di migrazione, ad esempio CreateIdentitySchema, che è un nome che descrive la migrazione.

    Attendere il caricamento del contesto del database nel campo Nomi delle classi DbContext. L'azione può richiedere alcuni secondi.

  4. Selezionare Fine per completare l'aggiornamento. Al termine dell'operazione, selezionare Chiudi.

  5. Selezionare Altre azioni (...) >Aggiornare il database.

    Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente.

    Attendere che i nomi delle classi DbContext vengano aggiornati e che vengano caricate le migrazioni precedenti. L'azione può richiedere alcuni secondi.

  6. Selezionare Fine per completare l'aggiornamento. Al termine dell'operazione, selezionare Chiudi.

Il comando update database esegue le migrazioni del Up metodo che non vengono applicate in un file di codice di migrazione creato dallo scaffolder. In questo caso, il comando esegue il Up metodo in Migrations/{TIME STAMP}_{MIGRATION NAME}.cs file, che crea tabelle Identity , vincoli e indici. Il segnaposto {TIME STAMP} è un timestamp e il segnaposto {MIGRATION NAME} è il nome della migrazione.

Se lo Identity schema viene creato ma non applicato al database, è sufficiente eseguire il comando per aggiornare il database:

  1. In Esplora soluzioni fare doppio clic su Servizi connessi.

  2. Nell'area SQL Server Express LocalDB di Servizi selezionare Azioni aggiuntive (... ) >Update database.

    Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente.

    Attendere che i nomi delle classi DbContext vengano aggiornati e che vengano caricate le migrazioni precedenti. L'azione può richiedere alcuni secondi.

  3. Selezionare Fine per completare l'aggiornamento. Al termine dell'operazione, selezionare Chiudi.

È 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 Visual Studio Gestione pacchetti Console eseguire il comando Get-Migration:

Get-Migration

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

Modifiche al layout

Facoltativo: Aggiungi il partial di accesso (_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>

Creare Identity in un progetto Razor con autorizzazione

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

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.


Esegui il Identity generatore di scaffolding seguendo la procedura seguente.

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e selezionare Add>New Scaffolded Item.

  2. Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding, seleziona Identity.

  3. Nel riquadro centrale selezionare Identitye quindi aggiungi.

  4. Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate:

    1. Se si dispone di una pagina di layout personalizzata esistente per Identity (_Layout.cshtml), selezionare la pagina esistente per evitare di sovrascrivere il layout con markup non corretto dallo scaffolder. Ad esempio, selezionare:

      • Pages/Shared/_Layout.cshtml per Razor Pages o Blazor Server progetti con un'infrastruttura Razor Pages esistente.
      • Views/Shared/_Layout.cshtml per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
    2. Selezionare l'icona con il segno più (+) e aggiungere la classe di contesto del database DbContext. È necessario selezionare almeno un file per aggiungere il contesto dati.

      • Per creare un contesto dati, selezionare l'icona con il segno più (+). 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 l'icona più (+) per Classe utente e specificare la classe (ad esempio, ContosoUser per una società denominata "Contoso").

    3. Selezionare Aggiungi per eseguire lo scaffolder.

Eseguire lo scaffolding Identity in un progetto MVC senza autorizzazione esistente

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

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.


Esegui il Identity generatore di scaffolding seguendo la procedura seguente.

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e selezionare Add>New Scaffolded Item.

  2. Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding, seleziona Identity.

  3. Nel riquadro centrale selezionare Identitye quindi aggiungi.

  4. Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate:

    1. Se si dispone di una pagina di layout personalizzata esistente per Identity (_Layout.cshtml), selezionare la pagina esistente per evitare di sovrascrivere il layout con markup non corretto dallo scaffolder. Ad esempio, selezionare:

      • Pages/Shared/_Layout.cshtml per Razor Pages o Blazor Server progetti con un'infrastruttura Razor Pages esistente.
      • Views/Shared/_Layout.cshtml per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
    2. Selezionare l'icona con il segno più (+) e aggiungere la classe di contesto del database DbContext. È necessario selezionare almeno un file per aggiungere il contesto dati.

      • Per creare un contesto dati, selezionare l'icona con il segno più (+). Accettare il valore predefinito o specificare una nuova classe per Identity.

      • Per creare una nuova classe utente, selezionare l'icona più (+) per Classe utente e specificare la classe (ad esempio, ContosoUser per una società denominata "Contoso").

    3. Selezionare Aggiungi per eseguire lo scaffolder.

Facoltativo: aggiungi il parziale di accesso (_LoginPartial) al file 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>

Il codice di database Identity generato richiede Entity Framework Core Migrations. Se una migrazione per generare lo Identity schema non è già stata creata e applicata al database, utilizzare le procedure seguenti per creare una migrazione e aggiornare il database.

I servizi connessi di Visual Studio vengono usati per aggiungere una EF Core migrazione e aggiornare il database.

  1. In Esplora soluzioni fare doppio clic su Servizi connessi.

  2. Nell'area SQL Server Express LocalDB di Servizi selezionare Azioni aggiuntive (... ) >Aggiungi migrazione.

  3. Assegnare alla migrazione un nome di migrazione, ad esempio CreateIdentitySchema, che è un nome che descrive la migrazione.

    Attendere il caricamento del contesto del database nel campo Nomi delle classi DbContext. L'azione può richiedere alcuni secondi.

  4. Selezionare Fine per completare l'aggiornamento. Al termine dell'operazione, selezionare Chiudi.

  5. Selezionare Altre azioni (...) >Aggiornare il database.

    Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente.

    Attendere che i nomi delle classi DbContext vengano aggiornati e che vengano caricate le migrazioni precedenti. L'azione può richiedere alcuni secondi.

  6. Selezionare Fine per completare l'aggiornamento. Al termine dell'operazione, selezionare Chiudi.

Il comando update database esegue le migrazioni del Up metodo che non vengono applicate in un file di codice di migrazione creato dallo scaffolder. In questo caso, il comando esegue il Up metodo in Migrations/{TIME STAMP}_{MIGRATION NAME}.cs file, che crea tabelle Identity , vincoli e indici. Il segnaposto {TIME STAMP} è un timestamp e il segnaposto {MIGRATION NAME} è il nome della migrazione.

Se lo Identity schema viene creato ma non applicato al database, è sufficiente eseguire il comando per aggiornare il database:

  1. In Esplora soluzioni fare doppio clic su Servizi connessi.

  2. Nell'area SQL Server Express LocalDB di Servizi selezionare Azioni aggiuntive (... ) >Update database.

    Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente.

    Attendere che i nomi delle classi DbContext vengano aggiornati e che vengano caricate le migrazioni precedenti. L'azione può richiedere alcuni secondi.

  3. Selezionare Fine per completare l'aggiornamento. Al termine dell'operazione, selezionare Chiudi.

È 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 Visual Studio Gestione pacchetti Console eseguire il comando 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 Microsoft. VisualStudio.Web.CodeGeneration.Design pacchetto NuGet.

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.


Esegui il Identity generatore di scaffolding seguendo la procedura seguente.

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e selezionare Add>New Scaffolded Item.

  2. Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding, seleziona Identity.

  3. Nel riquadro centrale selezionare Identitye quindi aggiungi.

  4. Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate:

    1. Se si dispone di una pagina di layout personalizzata esistente per Identity (_Layout.cshtml), selezionare la pagina esistente per evitare di sovrascrivere il layout con markup non corretto dallo scaffolder. Ad esempio, selezionare:

      • Pages/Shared/_Layout.cshtml per Razor Pages o Blazor Server progetti con un'infrastruttura Razor Pages esistente.
      • Views/Shared/_Layout.cshtml per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
    2. Selezionare l'icona con il segno più (+) e aggiungere la classe di contesto del database DbContext. È necessario selezionare almeno un file per aggiungere il contesto dati.

      • Per creare un contesto dati, selezionare l'icona con il segno più (+). 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 l'icona più (+) per Classe utente e specificare la classe (ad esempio, ContosoUser per una società denominata "Contoso").

    3. Selezionare Aggiungi per eseguire lo scaffolder.

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

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

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.


Esegui il Identity generatore di scaffolding seguendo la procedura seguente.

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e selezionare Add>New Scaffolded Item.

  2. Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding, seleziona Identity.

  3. Nel riquadro centrale selezionare Identitye quindi aggiungi.

  4. Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate:

    1. Se si dispone di una pagina di layout personalizzata esistente per Identity (_Layout.cshtml), selezionare la pagina esistente per evitare di sovrascrivere il layout con markup non corretto dallo scaffolder. Ad esempio, selezionare:

      • Pages/Shared/_Layout.cshtml per Razor Pages o Blazor Server progetti con un'infrastruttura Razor Pages esistente.
      • Views/Shared/_Layout.cshtml per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
    2. Selezionare l'icona con il segno più (+) e aggiungere la classe di contesto del database DbContext. È necessario selezionare almeno un file per aggiungere il contesto dati.

      • Per creare un contesto dati, selezionare l'icona con il segno più (+). 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 l'icona più (+) per Classe utente e specificare la classe (ad esempio, ContosoUser per una società denominata "Contoso").

    3. Selezionare Aggiungi per eseguire lo scaffolder.

Migrazioni

Il codice di database Identity generato richiede Entity Framework Core Migrations. Se una migrazione per generare lo Identity schema non è già stata creata e applicata al database, utilizzare le procedure seguenti per creare una migrazione e aggiornare il database.

I servizi connessi di Visual Studio vengono usati per aggiungere una EF Core migrazione e aggiornare il database.

  1. In Esplora soluzioni fare doppio clic su Servizi connessi.

  2. Nell'area SQL Server Express LocalDB di Servizi selezionare Azioni aggiuntive (... ) >Aggiungi migrazione.

  3. Assegnare alla migrazione un nome di migrazione, ad esempio CreateIdentitySchema, che è un nome che descrive la migrazione.

    Attendere il caricamento del contesto del database nel campo Nomi delle classi DbContext. L'azione può richiedere alcuni secondi.

  4. Selezionare Fine per completare l'aggiornamento. Al termine dell'operazione, selezionare Chiudi.

  5. Selezionare Altre azioni (...) >Aggiornare il database.

    Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente.

    Attendere che i nomi delle classi DbContext vengano aggiornati e che vengano caricate le migrazioni precedenti. L'azione può richiedere alcuni secondi.

  6. Selezionare Fine per completare l'aggiornamento. Al termine dell'operazione, selezionare Chiudi.

Il comando update database esegue le migrazioni del Up metodo che non vengono applicate in un file di codice di migrazione creato dallo scaffolder. In questo caso, il comando esegue il Up metodo in Migrations/{TIME STAMP}_{MIGRATION NAME}.cs file, che crea tabelle Identity , vincoli e indici. Il segnaposto {TIME STAMP} è un timestamp e il segnaposto {MIGRATION NAME} è il nome della migrazione.

Se lo Identity schema viene creato ma non applicato al database, è sufficiente eseguire il comando per aggiornare il database:

  1. In Esplora soluzioni fare doppio clic su Servizi connessi.

  2. Nell'area SQL Server Express LocalDB di Servizi selezionare Azioni aggiuntive (... ) >Update database.

    Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente.

    Attendere che i nomi delle classi DbContext vengano aggiornati e che vengano caricate le migrazioni precedenti. L'azione può richiedere alcuni secondi.

  3. Selezionare Fine per completare l'aggiornamento. Al termine dell'operazione, selezionare Chiudi.

È 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 Visual Studio Gestione pacchetti Console eseguire il comando Get-Migration:

Get-Migration

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

Endpoint di autenticazione di Style

Poiché le app sul lato server usano le pagine Blazor Pages Razor, lo stile dell'interfaccia utente cambia quando un visitatore passa da 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 componenti Razor, consigliamo di usare l'API web per gestire le azioni di Identity da componenti Razor tramite un'app ASP.NET Core con Identity abilitato sul lato server. Per informazioni su come creare API web per app Blazor, vedi Chiamare un'API web da un'app ASP.NET Core Blazor.

Un approccio all'uso dei componenti Razor per Identity anziché delle pagine Razor consiste nel creare componenti personalizzati IdentityRazor propri, ma Microsoft non consiglia né supporta questo 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:

Usa un layout personalizzato con gli stili dell'app Blazor

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 sul lato Blazor client

Le app Blazor lato client usano i propri approcci Identity dell'interfaccia utente e non possono usare lo scaffolding di ASP.NET Core Identity. Le app ASP.NET Core lato server di soluzioni ospitate Blazor possono seguire le Razor indicazioni su Pages/MVC contenute in questo articolo e sono configurate proprio come qualsiasi altro tipo di app ASP.NET Core che supporta Identity.

Il framework Blazor non include le versioni dei componenti Razor delle pagine UI Identity. 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 il codice sorgente completo 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, potrebbe essere necessaria la configurazione dell'attributo [StringLength] per la proprietà Password nelle pagine Identity generate tramite scaffolding. InputModel Password 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>
    
  • Commentare o rimuovere il link di registrazione in 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 Areas/Identity/Pages/Account/RegisterConfirmation pagina.

    • 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'applicazione 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 Core Identity come Razorlibreria di classi (RCL). Le applicazioni che includono Identity possono applicare lo scaffolder per aggiungere in modo selettivo il codice sorgente contenuto nell'RCL Identity . 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 senza usare l'RCL predefinito, consulta la sezione Creare il codice sorgente completo dell'Identityinterfaccia utente.

Le applicazioni che non includono l'autenticazione possono usare 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 di servizio non vengono generati quando si esegue lo scaffolding Identity. 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, aprire Startup.ConfigureServices e rimuovere 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 account individuali non devono creare un nuovo contesto di dati.

Creare Identity in un progetto vuoto

Esegui il Identity generatore di scaffolding seguendo la procedura seguente.

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e selezionare Add>New Scaffolded Item.

  2. Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding, seleziona Identity.

  3. Nel riquadro centrale selezionare Identitye quindi aggiungi.

  4. Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate:

    1. Se si dispone di una pagina di layout personalizzata esistente per Identity (_Layout.cshtml), selezionare la pagina esistente per evitare di sovrascrivere il layout con markup non corretto dallo scaffolder. Ad esempio, selezionare:

      • Pages/Shared/_Layout.cshtml per Razor Pages o Blazor Server progetti con un'infrastruttura Razor Pages esistente.
      • Views/Shared/_Layout.cshtml per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
    2. Selezionare l'icona con il segno più (+) e aggiungere la classe di contesto del database DbContext. È necessario selezionare almeno un file per aggiungere il contesto dati.

      • Per creare un contesto dati, selezionare l'icona con il segno più (+). Accettare il valore predefinito o specificare una nuova classe per Identity.

      • Per creare una nuova classe utente, selezionare l'icona più (+) per Classe utente e specificare la classe (ad esempio, ContosoUser per una società denominata "Contoso").

    3. Selezionare 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 è una scelta consigliata ma non obbligatoria. Per altre informazioni, vedere Protocollo HTTP Strict Transport Security (HSTS).

Il codice di database Identity generato richiede Entity Framework Core Migrations. Se una migrazione per generare lo Identity schema non è già stata creata e applicata al database, utilizzare le procedure seguenti per creare una migrazione e aggiornare il database.

I servizi connessi di Visual Studio vengono usati per aggiungere una EF Core migrazione e aggiornare il database.

  1. In Esplora soluzioni fare doppio clic su Servizi connessi.

  2. Nell'area SQL Server Express LocalDB di Servizi selezionare Azioni aggiuntive (... ) >Aggiungi migrazione.

  3. Assegnare alla migrazione un nome di migrazione, ad esempio CreateIdentitySchema, che è un nome che descrive la migrazione.

    Attendere il caricamento del contesto del database nel campo Nomi delle classi DbContext. L'azione può richiedere alcuni secondi.

  4. Selezionare Fine per completare l'aggiornamento. Al termine dell'operazione, selezionare Chiudi.

  5. Selezionare Altre azioni (...) >Aggiornare il database.

    Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente.

    Attendere che i nomi delle classi DbContext vengano aggiornati e che vengano caricate le migrazioni precedenti. L'azione può richiedere alcuni secondi.

  6. Selezionare Fine per completare l'aggiornamento. Al termine dell'operazione, selezionare Chiudi.

Il comando update database esegue le migrazioni del Up metodo che non vengono applicate in un file di codice di migrazione creato dallo scaffolder. In questo caso, il comando esegue il Up metodo in Migrations/{TIME STAMP}_{MIGRATION NAME}.cs file, che crea tabelle Identity , vincoli e indici. Il segnaposto {TIME STAMP} è un timestamp e il segnaposto {MIGRATION NAME} è il nome della migrazione.

Se lo Identity schema viene creato ma non applicato al database, è sufficiente eseguire il comando per aggiornare il database:

  1. In Esplora soluzioni fare doppio clic su Servizi connessi.

  2. Nell'area SQL Server Express LocalDB di Servizi selezionare Azioni aggiuntive (... ) >Update database.

    Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente.

    Attendere che i nomi delle classi DbContext vengano aggiornati e che vengano caricate le migrazioni precedenti. L'azione può richiedere alcuni secondi.

  3. Selezionare Fine per completare l'aggiornamento. Al termine dell'operazione, selezionare Chiudi.

È 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 Visual Studio Gestione pacchetti Console eseguire il comando Get-Migration:

Get-Migration

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

Generare Identity in un progetto Razor senza autorizzazione configurata

Esegui il Identity generatore di scaffolding seguendo la procedura seguente.

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e selezionare Add>New Scaffolded Item.

  2. Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding, seleziona Identity.

  3. Nel riquadro centrale selezionare Identitye quindi aggiungi.

  4. Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate:

    1. Se si dispone di una pagina di layout personalizzata esistente per Identity (_Layout.cshtml), selezionare la pagina esistente per evitare di sovrascrivere il layout con markup non corretto dallo scaffolder. Ad esempio, selezionare:

      • Pages/Shared/_Layout.cshtml per Razor Pages o Blazor Server progetti con un'infrastruttura Razor Pages esistente.
      • Views/Shared/_Layout.cshtml per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
    2. Selezionare l'icona con il segno più (+) e aggiungere la classe di contesto del database DbContext. È necessario selezionare almeno un file per aggiungere il contesto dati.

      • Per creare un contesto dati, selezionare l'icona con il segno più (+). Accettare il valore predefinito o specificare una nuova classe per Identity.

      • Per creare una nuova classe utente, selezionare l'icona più (+) per Classe utente e specificare la classe (ad esempio, ContosoUser per una società denominata "Contoso").

    3. Selezionare Aggiungi per eseguire lo scaffolder.

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

Migrazioni, UseAuthentication e il layout

Il codice di database Identity generato richiede Entity Framework Core Migrations. Se una migrazione per generare lo Identity schema non è già stata creata e applicata al database, utilizzare le procedure seguenti per creare una migrazione e aggiornare il database.

I servizi connessi di Visual Studio vengono usati per aggiungere una EF Core migrazione e aggiornare il database.

  1. In Esplora soluzioni fare doppio clic su Servizi connessi.

  2. Nell'area SQL Server Express LocalDB di Servizi selezionare Azioni aggiuntive (... ) >Aggiungi migrazione.

  3. Assegnare alla migrazione un nome di migrazione, ad esempio CreateIdentitySchema, che è un nome che descrive la migrazione.

    Attendere il caricamento del contesto del database nel campo Nomi delle classi DbContext. L'azione può richiedere alcuni secondi.

  4. Selezionare Fine per completare l'aggiornamento. Al termine dell'operazione, selezionare Chiudi.

  5. Selezionare Altre azioni (...) >Aggiornare il database.

    Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente.

    Attendere che i nomi delle classi DbContext vengano aggiornati e che vengano caricate le migrazioni precedenti. L'azione può richiedere alcuni secondi.

  6. Selezionare Fine per completare l'aggiornamento. Al termine dell'operazione, selezionare Chiudi.

Il comando update database esegue le migrazioni del Up metodo che non vengono applicate in un file di codice di migrazione creato dallo scaffolder. In questo caso, il comando esegue il Up metodo in Migrations/{TIME STAMP}_{MIGRATION NAME}.cs file, che crea tabelle Identity , vincoli e indici. Il segnaposto {TIME STAMP} è un timestamp e il segnaposto {MIGRATION NAME} è il nome della migrazione.

Se lo Identity schema viene creato ma non applicato al database, è sufficiente eseguire il comando per aggiornare il database:

  1. In Esplora soluzioni fare doppio clic su Servizi connessi.

  2. Nell'area SQL Server Express LocalDB di Servizi selezionare Azioni aggiuntive (... ) >Update database.

    Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente.

    Attendere che i nomi delle classi DbContext vengano aggiornati e che vengano caricate le migrazioni precedenti. L'azione può richiedere alcuni secondi.

  3. Selezionare Fine per completare l'aggiornamento. Al termine dell'operazione, selezionare Chiudi.

È 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 Visual Studio Gestione pacchetti Console eseguire il comando 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 è una scelta consigliata ma non obbligatoria. Per altre informazioni, vedere Protocollo HTTP Strict Transport Security (HSTS).

Modifiche al layout

Facoltativo: Aggiungi il partial di accesso (_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>

Creare Identity in un progetto Razor con autorizzazione

Esegui il Identity generatore di scaffolding seguendo la procedura seguente.

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e selezionare Add>New Scaffolded Item.

  2. Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding, seleziona Identity.

  3. Nel riquadro centrale selezionare Identitye quindi aggiungi.

  4. Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate:

    1. Se si dispone di una pagina di layout personalizzata esistente per Identity (_Layout.cshtml), selezionare la pagina esistente per evitare di sovrascrivere il layout con markup non corretto dallo scaffolder. Ad esempio, selezionare:

      • Pages/Shared/_Layout.cshtml per Razor Pages o Blazor Server progetti con un'infrastruttura Razor Pages esistente.
      • Views/Shared/_Layout.cshtml per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
    2. Selezionare l'icona con il segno più (+) e aggiungere la classe di contesto del database DbContext. È necessario selezionare almeno un file per aggiungere il contesto dati.

      • Per creare un contesto dati, selezionare l'icona con il segno più (+). 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 l'icona più (+) per Classe utente e specificare la classe (ad esempio, ContosoUser per una società denominata "Contoso").

    3. Selezionare Aggiungi per eseguire lo scaffolder.

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

Eseguire lo scaffolding Identity in un progetto MVC senza autorizzazione esistente

Esegui il Identity generatore di scaffolding seguendo la procedura seguente.

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e selezionare Add>New Scaffolded Item.

  2. Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding, seleziona Identity.

  3. Nel riquadro centrale selezionare Identitye quindi aggiungi.

  4. Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate:

    1. Se si dispone di una pagina di layout personalizzata esistente per Identity (_Layout.cshtml), selezionare la pagina esistente per evitare di sovrascrivere il layout con markup non corretto dallo scaffolder. Ad esempio, selezionare:

      • Pages/Shared/_Layout.cshtml per Razor Pages o Blazor Server progetti con un'infrastruttura Razor Pages esistente.
      • Views/Shared/_Layout.cshtml per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
    2. Selezionare l'icona con il segno più (+) e aggiungere la classe di contesto del database DbContext. È necessario selezionare almeno un file per aggiungere il contesto dati.

      • Per creare un contesto dati, selezionare l'icona con il segno più (+). Accettare il valore predefinito o specificare una nuova classe per Identity.

      • Per creare una nuova classe utente, selezionare l'icona più (+) per Classe utente e specificare la classe (ad esempio, ContosoUser per una società denominata "Contoso").

    3. Selezionare Aggiungi per eseguire lo scaffolder.

Facoltativo: aggiungi il parziale di accesso (_LoginPartial) al file 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>

Spostare il Pages/Shared/_LoginPartial.cshtml file in Views/Shared/_LoginPartial.cshtml.

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

Il codice di database Identity generato richiede Entity Framework Core Migrations. Se una migrazione per generare lo Identity schema non è già stata creata e applicata al database, utilizzare le procedure seguenti per creare una migrazione e aggiornare il database.

I servizi connessi di Visual Studio vengono usati per aggiungere una EF Core migrazione e aggiornare il database.

  1. In Esplora soluzioni fare doppio clic su Servizi connessi.

  2. Nell'area SQL Server Express LocalDB di Servizi selezionare Azioni aggiuntive (... ) >Aggiungi migrazione.

  3. Assegnare alla migrazione un nome di migrazione, ad esempio CreateIdentitySchema, che è un nome che descrive la migrazione.

    Attendere il caricamento del contesto del database nel campo Nomi delle classi DbContext. L'azione può richiedere alcuni secondi.

  4. Selezionare Fine per completare l'aggiornamento. Al termine dell'operazione, selezionare Chiudi.

  5. Selezionare Altre azioni (...) >Aggiornare il database.

    Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente.

    Attendere che i nomi delle classi DbContext vengano aggiornati e che vengano caricate le migrazioni precedenti. L'azione può richiedere alcuni secondi.

  6. Selezionare Fine per completare l'aggiornamento. Al termine dell'operazione, selezionare Chiudi.

Il comando update database esegue le migrazioni del Up metodo che non vengono applicate in un file di codice di migrazione creato dallo scaffolder. In questo caso, il comando esegue il Up metodo in Migrations/{TIME STAMP}_{MIGRATION NAME}.cs file, che crea tabelle Identity , vincoli e indici. Il segnaposto {TIME STAMP} è un timestamp e il segnaposto {MIGRATION NAME} è il nome della migrazione.

Se lo Identity schema viene creato ma non applicato al database, è sufficiente eseguire il comando per aggiornare il database:

  1. In Esplora soluzioni fare doppio clic su Servizi connessi.

  2. Nell'area SQL Server Express LocalDB di Servizi selezionare Azioni aggiuntive (... ) >Update database.

    Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente.

    Attendere che i nomi delle classi DbContext vengano aggiornati e che vengano caricate le migrazioni precedenti. L'azione può richiedere alcuni secondi.

  3. Selezionare Fine per completare l'aggiornamento. Al termine dell'operazione, selezionare Chiudi.

È 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 Visual Studio Gestione pacchetti Console eseguire il comando 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 è una scelta consigliata ma non obbligatoria. Per altre informazioni, vedere Protocollo HTTP Strict Transport Security (HSTS).

Eseguire lo scaffolding Identity in un progetto MVC con autorizzazione

Esegui il Identity generatore di scaffolding seguendo la procedura seguente.

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e selezionare Add>New Scaffolded Item.

  2. Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding, seleziona Identity.

  3. Nel riquadro centrale selezionare Identitye quindi aggiungi.

  4. Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate:

    1. Se si dispone di una pagina di layout personalizzata esistente per Identity (_Layout.cshtml), selezionare la pagina esistente per evitare di sovrascrivere il layout con markup non corretto dallo scaffolder. Ad esempio, selezionare:

      • Pages/Shared/_Layout.cshtml per Razor Pages o Blazor Server progetti con un'infrastruttura Razor Pages esistente.
      • Views/Shared/_Layout.cshtml per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
    2. Selezionare l'icona con il segno più (+) e aggiungere la classe di contesto del database DbContext. È necessario selezionare almeno un file per aggiungere il contesto dati.

      • Per creare un contesto dati, selezionare l'icona con il segno più (+). 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 l'icona più (+) per Classe utente e specificare la classe (ad esempio, ContosoUser per una società denominata "Contoso").

    3. Selezionare Aggiungi per eseguire lo scaffolder.

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

Esegui il Identity generatore di scaffolding seguendo la procedura seguente.

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e selezionare Add>New Scaffolded Item.

  2. Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding, seleziona Identity.

  3. Nel riquadro centrale selezionare Identitye quindi aggiungi.

  4. Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate:

    1. Se si dispone di una pagina di layout personalizzata esistente per Identity (_Layout.cshtml), selezionare la pagina esistente per evitare di sovrascrivere il layout con markup non corretto dallo scaffolder. Ad esempio, selezionare:

      • Pages/Shared/_Layout.cshtml per Razor Pages o Blazor Server progetti con un'infrastruttura Razor Pages esistente.
      • Views/Shared/_Layout.cshtml per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
    2. Selezionare l'icona con il segno più (+) e aggiungere la classe di contesto del database DbContext. È necessario selezionare almeno un file per aggiungere il contesto dati.

      • Per creare un contesto dati, selezionare l'icona con il segno più (+). Accettare il valore predefinito o specificare una nuova classe per Identity.

      • Per creare una nuova classe utente, selezionare l'icona più (+) per Classe utente e specificare la classe (ad esempio, ContosoUser per una società denominata "Contoso").

    3. Selezionare Aggiungi per eseguire lo scaffolder.

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

Migrazioni

Il codice di database Identity generato richiede Entity Framework Core Migrations. Se una migrazione per generare lo Identity schema non è già stata creata e applicata al database, utilizzare le procedure seguenti per creare una migrazione e aggiornare il database.

I servizi connessi di Visual Studio vengono usati per aggiungere una EF Core migrazione e aggiornare il database.

  1. In Esplora soluzioni fare doppio clic su Servizi connessi.

  2. Nell'area SQL Server Express LocalDB di Servizi selezionare Azioni aggiuntive (... ) >Aggiungi migrazione.

  3. Assegnare alla migrazione un nome di migrazione, ad esempio CreateIdentitySchema, che è un nome che descrive la migrazione.

    Attendere il caricamento del contesto del database nel campo Nomi delle classi DbContext. L'azione può richiedere alcuni secondi.

  4. Selezionare Fine per completare l'aggiornamento. Al termine dell'operazione, selezionare Chiudi.

  5. Selezionare Altre azioni (...) >Aggiornare il database.

    Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente.

    Attendere che i nomi delle classi DbContext vengano aggiornati e che vengano caricate le migrazioni precedenti. L'azione può richiedere alcuni secondi.

  6. Selezionare Fine per completare l'aggiornamento. Al termine dell'operazione, selezionare Chiudi.

Il comando update database esegue le migrazioni del Up metodo che non vengono applicate in un file di codice di migrazione creato dallo scaffolder. In questo caso, il comando esegue il Up metodo in Migrations/{TIME STAMP}_{MIGRATION NAME}.cs file, che crea tabelle Identity , vincoli e indici. Il segnaposto {TIME STAMP} è un timestamp e il segnaposto {MIGRATION NAME} è il nome della migrazione.

Se lo Identity schema viene creato ma non applicato al database, è sufficiente eseguire il comando per aggiornare il database:

  1. In Esplora soluzioni fare doppio clic su Servizi connessi.

  2. Nell'area SQL Server Express LocalDB di Servizi selezionare Azioni aggiuntive (... ) >Update database.

    Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente.

    Attendere che i nomi delle classi DbContext vengano aggiornati e che vengano caricate le migrazioni precedenti. L'azione può richiedere alcuni secondi.

  3. Selezionare Fine per completare l'aggiornamento. Al termine dell'operazione, selezionare Chiudi.

È 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 Visual Studio Gestione pacchetti Console eseguire il comando Get-Migration:

Get-Migration

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

Endpoint di autenticazione di Style

Poiché le app sul lato server usano le pagine Blazor Pages Razor, lo stile dell'interfaccia utente cambia quando un visitatore passa da 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 componenti Razor, usare gli endpoint API web nell'app Blazor per gestire le azioni dell'account utente.

Usa un layout personalizzato con gli stili dell'app Blazor

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

Esegui il Identity generatore di scaffolding seguendo la procedura seguente.

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e selezionare Add>New Scaffolded Item.

  2. Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding, seleziona Identity.

  3. Nel riquadro centrale selezionare Identitye quindi aggiungi.

  4. Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate:

    1. Se si dispone di una pagina di layout personalizzata esistente per Identity (_Layout.cshtml), selezionare la pagina esistente per evitare di sovrascrivere il layout con markup non corretto dallo scaffolder. Ad esempio, selezionare:

      • Pages/Shared/_Layout.cshtml per Razor Pages o Blazor Server progetti con un'infrastruttura Razor Pages esistente.
      • Views/Shared/_Layout.cshtml per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
    2. Selezionare l'icona con il segno più (+) e aggiungere la classe di contesto del database DbContext. È necessario selezionare almeno un file per aggiungere il contesto dati.

      • Per creare un contesto dati, selezionare l'icona con il segno più (+). 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 l'icona più (+) per Classe utente e specificare la classe (ad esempio, ContosoUser per una società denominata "Contoso").

    3. Selezionare Aggiungi per eseguire lo scaffolder.

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

App sul lato Blazor client

Le app Blazor lato client usano i propri approcci Identity dell'interfaccia utente e non possono usare lo scaffolding di ASP.NET Core Identity. Le app ASP.NET Core lato server di soluzioni ospitate Blazor possono seguire le Razor indicazioni su Pages/MVC contenute in questo articolo e sono configurate proprio come qualsiasi altro tipo di app ASP.NET Core che supporta Identity.

Il framework Blazor non include le versioni dei componenti Razor delle pagine UI Identity. 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 il codice sorgente completo 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, potrebbe essere necessaria la configurazione dell'attributo [StringLength] per la proprietà Password nelle pagine Identity generate tramite scaffolding. InputModel Password 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>
    
  • Commentare o rimuovere il link di registrazione in 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 Areas/Identity/Pages/Account/RegisterConfirmation pagina.

    • 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'applicazione 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

Modifiche apportate al codice di autenticazione in ASP.NET Core 2.1 o versione successiva