Eseguire lo scaffolding Identity nei progetti ASP.NET Core
BlazorIdentity impalcatura
Identity ASP.NET core scaffolding aggiunge ASP.NET Core Identity a Blazor Web Apps e Blazor Server alle app. Dopo che lo scaffolder aggiunge i IdentityRazor componenti all'app, puoi personalizzare i componenti in base ai requisiti dell'app.
Anche se lo scaffolder genera il codice C# necessario per eseguire lo scaffolding Identity nell'app, è necessario aggiornare il database del progetto con una migrazione del database Entity Framework (EF Core) per completare il processo. Questo articolo illustra i passaggi necessari per eseguire la migrazione di un database.
Esaminare le modifiche dopo l'esecuzione dello Identity scaffolder. È consigliabile 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 del servizio non vengono generati durante lo scaffolding Identitydi . I servizi per abilitare queste funzionalità devono essere aggiunti manualmente.
RazorScaffolding di pagine e MVC Identity
ASP.NET Core fornisce ASP.NET Core Identitycome libreria di Razor 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 applicare lo scaffolder per aggiungere il pacchetto RCL Identity . È possibile selezionare Identity il codice da generare.
Anche se lo scaffolder genera la maggior parte del codice necessario, è necessario aggiornare il progetto per completare il processo. Questo documento illustra i passaggi necessari per completare un Identity aggiornamento dello scaffolding.
È consigliabile usare un sistema di controllo del codice sorgente che mostra le differenze tra i file e consente di eseguire il backup delle modifiche. Esaminare le modifiche dopo l'esecuzione dello Identity scaffolder.
I servizi sono necessari quando si usano Two Factor Authentication, la conferma dell'account e il ripristino delle password e altre funzionalità di sicurezza con Identity. I servizi o gli stub del servizio non vengono generati durante lo scaffolding Identitydi . I servizi per abilitare queste funzionalità devono essere aggiunti manualmente. Ad esempio, vedere Richiedi conferma tramite posta elettronica.
In genere, le app create con singoli account non devono creare un nuovo contesto dati.
Eseguire lo scaffolding Identity in un Blazor progetto
Questa sezione si applica a Blazor Web Apps e Blazor Server alle app.
Eseguire lo Identity scaffolder:
- Da Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto >Aggiungi>nuovo elemento con scaffolding.
- Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Identity. Selezionare Blazor Identity nel riquadro centrale. Seleziona il pulsante Aggiungi.
- Nella finestra di dialogo AggiungiIdentityBlazor:
- Selezionare o aggiungere con il pulsante più (+) la classe di contesto del database (classe DbContext).
- Selezionare il provider di database (provider di database), che per impostazione predefinita è SQL Server.
- Selezionare o aggiungere con il pulsante più (+) la classe utente (classe User).
- Seleziona il pulsante Aggiungi.
Il codice del database generato Identity richiede EF Core Migrazioni. La procedura seguente illustra come creare e applicare una migrazione al database.
I servizi connessi di Visual Studio vengono usati per aggiungere una EF Core migrazione e aggiornare il database.
In Esplora soluzioni fare doppio clic su Servizi connessi. Nell'area SQL Server Express LocalDB delle dipendenze del servizio selezionare i puntini di sospensione (...
) seguiti da Aggiungi migrazione.
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 Dei nomi delle classi DbContext, che potrebbero richiedere alcuni secondi. Selezionare Fine per creare la migrazione.
Selezionare il pulsante Chiudi al termine dell'operazione.
Selezionare di nuovo i puntini di sospensione (...
) seguiti dal comando Aggiorna database .
Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente. Attendere che il campo Dei nomi delle classi DbContext venga aggiornato e che le migrazioni precedenti vengano caricate, che potrebbero richiedere alcuni secondi. Selezionare il pulsante Fine.
Selezionare il pulsante Chiudi al termine dell'operazione.
Il comando update database esegue le migrazioni del Up
metodo che non sono state applicate in un file di codice di migrazione creato dallo scaffolder. In questo caso, il comando esegue il Up
metodo nel Migrations/{TIME STAMP}_{MIGRATION NAME}.cs
file , che crea tabelle Identity , vincoli e indici. Il {TIME STAMP}
segnaposto è un timestamp e il {MIGRATION NAME}
segnaposto è il nome della migrazione.
App sul lato Blazor client (Standalone Blazor WebAssembly)
Le app sul lato Blazor client (Standalone Blazor WebAssembly) usano i propri Identity approcci all'interfaccia utente e non possono usare ASP.NET scaffolding core Identity .
Per altre informazioni, vedere gli Blazor articoli Sicurezza e Identity .
Eseguire lo scaffolding Identity in un Razor progetto senza autorizzazione esistente
Installare il pacchetto NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design
.
Nota
Per indicazioni sull'aggiunta di pacchetti alle app .NET, vedere gli articoli sotto Installare e gestire pacchetti in Flusso di lavoro dell'utilizzo di pacchetti (documentazione di NuGet). Confermare le versioni corrette del pacchetto all'indirizzo NuGet.org.
Eseguire lo Identity scaffolder:
- Da Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto >Aggiungi>nuovo elemento con scaffolding.
- Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Identity. Selezionare Identity nel riquadro centrale. Seleziona il pulsante Aggiungi.
- Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate.
- Se si dispone di una pagina di layout personalizzata esistente per Identity (
_Layout.cshtml
), selezionare la pagina di layout esistente per evitare di sovrascrivere il layout con markup errato dallo scaffolder. Ad esempio, selezionare:Pages/Shared/_Layout.cshtml
per Razor Pagine o Blazor Server progetti con l'infrastruttura Pages esistente Razor .Views/Shared/_Layout.cshtml
per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
- Per il contesto dati (classe DbContext):
- Selezionare la classe del contesto dati. È necessario selezionare almeno un file per aggiungere il contesto dati.
- Per creare un contesto dati ed eventualmente creare una nuova classe utente per Identity, selezionare il + pulsante . Accettare il valore predefinito o specificare una classe ,
Contoso.Data.ApplicationDbContext
ad esempio per una società denominata "Contoso". Per creare una nuova classe utente, selezionare il + pulsante Per classe User e specificare la classe (ad esempio,ContosoUser
per una società denominata "Contoso").
- Selezionare il pulsante Aggiungi per eseguire lo scaffolder.
- Se si dispone di una pagina di layout personalizzata esistente per Identity (
Migrazioni, UseAuthentication e layout
Il codice del database generato Identity richiede migrazioni Entity Framework (EF) Core. Se una migrazione per generare lo Identity schema non è stata creata e applicata al database, 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.
In Esplora soluzioni fare doppio clic su Servizi connessi. Nell'area SQL Server Express LocalDB delle dipendenze del servizio selezionare i puntini di sospensione (...
) seguiti da Aggiungi migrazione.
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 Dei nomi delle classi DbContext, che potrebbero richiedere alcuni secondi. Selezionare Fine per creare la migrazione.
Selezionare il pulsante Chiudi al termine dell'operazione.
Selezionare di nuovo i puntini di sospensione (...
) seguiti dal comando Aggiorna database .
Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente. Attendere che il campo Dei nomi delle classi DbContext venga aggiornato e che le migrazioni precedenti vengano caricate, che potrebbero richiedere alcuni secondi. Selezionare il pulsante Fine.
Selezionare il pulsante Chiudi al termine dell'operazione.
Il comando update database esegue le migrazioni del Up
metodo che non sono state applicate in un file di codice di migrazione creato dallo scaffolder. In questo caso, il comando esegue il Up
metodo nel Migrations/{TIME STAMP}_{MIGRATION NAME}.cs
file , che crea tabelle Identity , vincoli e indici. Il {TIME STAMP}
segnaposto è un timestamp e il {MIGRATION NAME}
segnaposto è il nome della migrazione.
Se lo Identity schema è già stato creato ma non applicato al database, è necessario eseguire solo il comando per aggiornare il database:
In Esplora soluzioni fare doppio clic su Servizi connessi. Nell'area SQL Server Express LocalDB delle dipendenze del servizio selezionare i puntini di sospensione (...
) seguiti dal comando Aggiorna database .
Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente. Attendere che il campo Dei nomi delle classi DbContext venga aggiornato e che le migrazioni precedenti vengano caricate, che potrebbero richiedere alcuni secondi. Selezionare il pulsante Fine.
Selezionare il pulsante Chiudi al termine dell'operazione.
È possibile confermare l'applicazione di uno Identity schema con il comando seguente. L'output del comando include una colonna "applied
" per mostrare quali migrazioni vengono applicate al database.
Nella console di Visual Studio Gestione pacchetti eseguire Get-Migration
:
Get-Migration
Se esistono più contesti di database, specificare il contesto con il -Context
parametro .
Modifiche al layout
Facoltativo: aggiungere l'account di accesso parziale (_LoginPartial
) al file di layout:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] - WebRPnoAuth2Auth</title>
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
<link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
<link rel="stylesheet" href="~/WebRPnoAuth2Auth.styles.css" asp-append-version="true" />
</head>
<body>
<header>
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
<div class="container">
<a class="navbar-brand" asp-area="" asp-page="/Index">WebRPnoAuth2Auth</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
</li>
</ul>
<partial name="_LoginPartial" />
</div>
</div>
</nav>
</header>
<div class="container">
<main role="main" class="pb-3">
@RenderBody()
</main>
</div>
<footer class="border-top footer text-muted">
<div class="container">
© 2021 - WebRPnoAuth2Auth - <a asp-area="" asp-page="/Privacy">Privacy</a>
</div>
</footer>
<script src="~/lib/jquery/dist/jquery.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>
@await RenderSectionAsync("Scripts", required: false)
</body>
</html>
Eseguire lo scaffolding Identity in un Razor progetto con autorizzazione
Installare il pacchetto NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design
.
Nota
Per indicazioni sull'aggiunta di pacchetti alle app .NET, vedere gli articoli sotto Installare e gestire pacchetti in Flusso di lavoro dell'utilizzo di pacchetti (documentazione di NuGet). Confermare le versioni corrette del pacchetto all'indirizzo NuGet.org.
Eseguire lo Identity scaffolder:
- Da Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto >Aggiungi>nuovo elemento con scaffolding.
- Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Identity. Selezionare Identity nel riquadro centrale. Seleziona il pulsante Aggiungi.
- Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate.
- Se si dispone di una pagina di layout personalizzata esistente per Identity (
_Layout.cshtml
), selezionare la pagina di layout esistente per evitare di sovrascrivere il layout con markup errato dallo scaffolder. Ad esempio, selezionare:Pages/Shared/_Layout.cshtml
per Razor Pagine o Blazor Server progetti con l'infrastruttura Pages esistente Razor .Views/Shared/_Layout.cshtml
per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
- Per il contesto dati (classe DbContext):
- Selezionare la classe del contesto dati. È necessario selezionare almeno un file per aggiungere il contesto dati.
- Per creare un contesto dati ed eventualmente creare una nuova classe utente per Identity, selezionare il + pulsante . Accettare il valore predefinito o specificare una classe ,
Contoso.Data.ApplicationDbContext
ad esempio per una società denominata "Contoso". Per creare una nuova classe utente, selezionare il + pulsante Per classe User e specificare la classe (ad esempio,ContosoUser
per una società denominata "Contoso").
- Selezionare il pulsante Aggiungi per eseguire lo scaffolder.
- Se si dispone di una pagina di layout personalizzata esistente per Identity (
Eseguire lo scaffolding Identity in un progetto MVC senza autorizzazione esistente
Installare il pacchetto NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design
.
Nota
Per indicazioni sull'aggiunta di pacchetti alle app .NET, vedere gli articoli sotto Installare e gestire pacchetti in Flusso di lavoro dell'utilizzo di pacchetti (documentazione di NuGet). Confermare le versioni corrette del pacchetto all'indirizzo NuGet.org.
Eseguire lo Identity scaffolder:
- Da Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto >Aggiungi>nuovo elemento con scaffolding.
- Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Identity. Selezionare Identity nel riquadro centrale. Seleziona il pulsante Aggiungi.
- Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate.
- Se si dispone di una pagina di layout personalizzata esistente per Identity (
_Layout.cshtml
), selezionare la pagina di layout esistente per evitare di sovrascrivere il layout con markup errato dallo scaffolder. Ad esempio, selezionare:Pages/Shared/_Layout.cshtml
per Razor Pagine o Blazor Server progetti con l'infrastruttura Pages esistente Razor .Views/Shared/_Layout.cshtml
per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
- Per il contesto dati (classe DbContext):
- Selezionare la classe del contesto dati. È necessario selezionare almeno un file per aggiungere il contesto dati.
- Per creare un contesto dati ed eventualmente creare una nuova classe utente per Identity, selezionare il + pulsante . Accettare il valore predefinito o specificare una classe ,
Contoso.Data.ApplicationDbContext
ad esempio per una società denominata "Contoso". Per creare una nuova classe utente, selezionare il + pulsante Per classe User e specificare la classe (ad esempio,ContosoUser
per una società denominata "Contoso").
- Selezionare il pulsante Aggiungi per eseguire lo scaffolder.
- Se si dispone di una pagina di layout personalizzata esistente per Identity (
Facoltativo: aggiungere l'account di accesso parziale (_LoginPartial
) al Views/Shared/_Layout.cshtml
file:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] - WebRPnoAuth2Auth</title>
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
<link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
<link rel="stylesheet" href="~/WebRPnoAuth2Auth.styles.css" asp-append-version="true" />
</head>
<body>
<header>
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
<div class="container">
<a class="navbar-brand" asp-area="" asp-page="/Index">WebRPnoAuth2Auth</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
</li>
</ul>
<partial name="_LoginPartial" />
</div>
</div>
</nav>
</header>
<div class="container">
<main role="main" class="pb-3">
@RenderBody()
</main>
</div>
<footer class="border-top footer text-muted">
<div class="container">
© 2021 - WebRPnoAuth2Auth - <a asp-area="" asp-page="/Privacy">Privacy</a>
</div>
</footer>
<script src="~/lib/jquery/dist/jquery.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>
@await RenderSectionAsync("Scripts", required: false)
</body>
</html>
Il codice del database generato Identity richiede migrazioni Entity Framework (EF) Core. Se una migrazione per generare lo Identity schema non è stata creata e applicata al database, 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.
In Esplora soluzioni fare doppio clic su Servizi connessi. Nell'area SQL Server Express LocalDB delle dipendenze del servizio selezionare i puntini di sospensione (...
) seguiti da Aggiungi migrazione.
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 Dei nomi delle classi DbContext, che potrebbero richiedere alcuni secondi. Selezionare Fine per creare la migrazione.
Selezionare il pulsante Chiudi al termine dell'operazione.
Selezionare di nuovo i puntini di sospensione (...
) seguiti dal comando Aggiorna database .
Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente. Attendere che il campo Dei nomi delle classi DbContext venga aggiornato e che le migrazioni precedenti vengano caricate, che potrebbero richiedere alcuni secondi. Selezionare il pulsante Fine.
Selezionare il pulsante Chiudi al termine dell'operazione.
Il comando update database esegue le migrazioni del Up
metodo che non sono state applicate in un file di codice di migrazione creato dallo scaffolder. In questo caso, il comando esegue il Up
metodo nel Migrations/{TIME STAMP}_{MIGRATION NAME}.cs
file , che crea tabelle Identity , vincoli e indici. Il {TIME STAMP}
segnaposto è un timestamp e il {MIGRATION NAME}
segnaposto è il nome della migrazione.
Se lo Identity schema è già stato creato ma non applicato al database, è necessario eseguire solo il comando per aggiornare il database:
In Esplora soluzioni fare doppio clic su Servizi connessi. Nell'area SQL Server Express LocalDB delle dipendenze del servizio selezionare i puntini di sospensione (...
) seguiti dal comando Aggiorna database .
Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente. Attendere che il campo Dei nomi delle classi DbContext venga aggiornato e che le migrazioni precedenti vengano caricate, che potrebbero richiedere alcuni secondi. Selezionare il pulsante Fine.
Selezionare il pulsante Chiudi al termine dell'operazione.
È possibile confermare l'applicazione di uno Identity schema con il comando seguente. L'output del comando include una colonna "applied
" per mostrare quali migrazioni vengono applicate al database.
Nella console di Visual Studio Gestione pacchetti eseguire Get-Migration
:
Get-Migration
Se esistono più contesti di database, specificare il contesto con il -Context
parametro .
Aggiungere MapRazorPages
a Program.cs
come illustrato nel codice evidenziato seguente:
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebMVCauth.Data;
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddControllersWithViews();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapRazorPages();
app.Run();
Eseguire lo scaffolding Identity in un progetto MVC con autorizzazione
Installare il pacchetto NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design
.
Nota
Per indicazioni sull'aggiunta di pacchetti alle app .NET, vedere gli articoli sotto Installare e gestire pacchetti in Flusso di lavoro dell'utilizzo di pacchetti (documentazione di NuGet). Confermare le versioni corrette del pacchetto all'indirizzo NuGet.org.
Eseguire lo Identity scaffolder:
- Da Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto >Aggiungi>nuovo elemento con scaffolding.
- Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Identity. Selezionare Identity nel riquadro centrale. Seleziona il pulsante Aggiungi.
- Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate.
- Se si dispone di una pagina di layout personalizzata esistente per Identity (
_Layout.cshtml
), selezionare la pagina di layout esistente per evitare di sovrascrivere il layout con markup errato dallo scaffolder. Ad esempio, selezionare:Pages/Shared/_Layout.cshtml
per Razor Pagine o Blazor Server progetti con l'infrastruttura Pages esistente Razor .Views/Shared/_Layout.cshtml
per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
- Per il contesto dati (classe DbContext):
- Selezionare la classe del contesto dati. È necessario selezionare almeno un file per aggiungere il contesto dati.
- Per creare un contesto dati ed eventualmente creare una nuova classe utente per Identity, selezionare il + pulsante . Accettare il valore predefinito o specificare una classe ,
Contoso.Data.ApplicationDbContext
ad esempio per una società denominata "Contoso". Per creare una nuova classe utente, selezionare il + pulsante Per classe User e specificare la classe (ad esempio,ContosoUser
per una società denominata "Contoso").
- Selezionare il pulsante Aggiungi per eseguire lo scaffolder.
- Se si dispone di una pagina di layout personalizzata esistente per Identity (
Creare un'origine completa Identity dell'interfaccia utente
Per mantenere il controllo completo dell'interfaccia Identity utente, eseguire lo Identity scaffolder e selezionare Sostituisci tutti i file.
Configurazione della password
Se PasswordOptions sono configurati in Startup.ConfigureServices
, [StringLength]
la configurazione dell'attributo potrebbe essere necessaria per la Password
proprietà nelle pagine con scaffolding Identity . 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>
Impostare come commento o rimuovere il collegamento di registrazione da
Areas/Identity/Pages/Account/Login.cshtml
@* <p> <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a> </p> *@
Aggiornare la
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'app console.
Il codice seguente descrive un approccio all'aggiunta di utenti:
- Un elenco di utenti viene letto in memoria.
- Per ogni utente viene generata una password univoca complessa.
- L'utente viene aggiunto al Identity database.
- L'utente riceve una notifica e comunica di modificare la password.
public class Program
{
public static void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
var context = services.GetRequiredService<AppDbCntx>();
context.Database.Migrate();
var config = host.Services.GetRequiredService<IConfiguration>();
var userList = config.GetSection("userList").Get<List<string>>();
SeedData.Initialize(services, userList).Wait();
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occurred adding users.");
}
}
host.Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
Il codice seguente descrive l'aggiunta di un utente:
public static async Task Initialize(IServiceProvider serviceProvider,
List<string> userList)
{
var userManager = serviceProvider.GetService<UserManager<IdentityUser>>();
foreach (var userName in userList)
{
var userPassword = GenerateSecurePassword();
var userId = await EnsureUser(userManager, userName, userPassword);
NotifyUser(userName, userPassword);
}
}
private static async Task<string> EnsureUser(UserManager<IdentityUser> userManager,
string userName, string userPassword)
{
var user = await userManager.FindByNameAsync(userName);
if (user == null)
{
user = new IdentityUser(userName)
{
EmailConfirmed = true
};
await userManager.CreateAsync(user, userPassword);
}
return user.Id;
}
È possibile seguire un approccio simile per gli scenari di produzione.
Impedire la pubblicazione di asset statici Identity
Per impedire la pubblicazione di asset statici Identity nella radice Web, vedere Introduzione a Identity in ASP.NET Core.
ASP.NET Core fornisce ASP.NET Core Identitycome libreria di Razor 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 e non usare l'RCL predefinito, vedere la sezione Creare l'origine completa Identity dell'interfaccia utente.
Le applicazioni che non includono l'autenticazione possono applicare lo scaffolder per aggiungere il pacchetto RCL Identity . È possibile selezionare Identity il codice da generare.
Anche se lo scaffolder genera la maggior parte del codice necessario, è necessario aggiornare il progetto per completare il processo. Questo documento illustra i passaggi necessari per completare un Identity aggiornamento dello scaffolding.
È consigliabile usare un sistema di controllo del codice sorgente che mostra le differenze tra i file e consente di eseguire il backup delle modifiche. Esaminare le modifiche dopo l'esecuzione dello Identity scaffolder.
I servizi sono necessari quando si usano Two Factor Authentication, la conferma dell'account e il ripristino delle password e altre funzionalità di sicurezza con Identity. I servizi o gli stub del servizio non vengono generati durante lo scaffolding Identitydi . I servizi per abilitare queste funzionalità devono essere aggiunti manualmente. Ad esempio, vedere Richiedi conferma tramite posta elettronica.
In genere, le app create con singoli account non devono creare un nuovo contesto dati.
Eseguire lo scaffolding Identity in un Razor progetto senza autorizzazione esistente
Installare il pacchetto NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design
.
Nota
Per indicazioni sull'aggiunta di pacchetti alle app .NET, vedere gli articoli sotto Installare e gestire pacchetti in Flusso di lavoro dell'utilizzo di pacchetti (documentazione di NuGet). Confermare le versioni corrette del pacchetto all'indirizzo NuGet.org.
Eseguire lo Identity scaffolder:
- Da Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto >Aggiungi>nuovo elemento con scaffolding.
- Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Identity. Selezionare Identity nel riquadro centrale. Seleziona il pulsante Aggiungi.
- Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate.
- Se si dispone di una pagina di layout personalizzata esistente per Identity (
_Layout.cshtml
), selezionare la pagina di layout esistente per evitare di sovrascrivere il layout con markup errato dallo scaffolder. Ad esempio, selezionare:Pages/Shared/_Layout.cshtml
per Razor Pagine o Blazor Server progetti con l'infrastruttura Pages esistente Razor .Views/Shared/_Layout.cshtml
per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
- Per il contesto dati (classe DbContext):
- Selezionare la classe del contesto dati. È necessario selezionare almeno un file per aggiungere il contesto dati.
- Per creare un contesto dati ed eventualmente creare una nuova classe utente per Identity, selezionare il + pulsante . Accettare il valore predefinito o specificare una classe ,
Contoso.Data.ApplicationDbContext
ad esempio per una società denominata "Contoso". Per creare una nuova classe utente, selezionare il + pulsante Per classe User e specificare la classe (ad esempio,ContosoUser
per una società denominata "Contoso").
- Selezionare il pulsante Aggiungi per eseguire lo scaffolder.
- Se si dispone di una pagina di layout personalizzata esistente per Identity (
Migrazioni, UseAuthentication e layout
Il codice del database generato Identity richiede migrazioni Entity Framework (EF) Core. Se una migrazione per generare lo Identity schema non è stata creata e applicata al database, 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.
In Esplora soluzioni fare doppio clic su Servizi connessi. Nell'area SQL Server Express LocalDB delle dipendenze del servizio selezionare i puntini di sospensione (...
) seguiti da Aggiungi migrazione.
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 Dei nomi delle classi DbContext, che potrebbero richiedere alcuni secondi. Selezionare Fine per creare la migrazione.
Selezionare il pulsante Chiudi al termine dell'operazione.
Selezionare di nuovo i puntini di sospensione (...
) seguiti dal comando Aggiorna database .
Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente. Attendere che il campo Dei nomi delle classi DbContext venga aggiornato e che le migrazioni precedenti vengano caricate, che potrebbero richiedere alcuni secondi. Selezionare il pulsante Fine.
Selezionare il pulsante Chiudi al termine dell'operazione.
Il comando update database esegue le migrazioni del Up
metodo che non sono state applicate in un file di codice di migrazione creato dallo scaffolder. In questo caso, il comando esegue il Up
metodo nel Migrations/{TIME STAMP}_{MIGRATION NAME}.cs
file , che crea tabelle Identity , vincoli e indici. Il {TIME STAMP}
segnaposto è un timestamp e il {MIGRATION NAME}
segnaposto è il nome della migrazione.
Se lo Identity schema è già stato creato ma non applicato al database, è necessario eseguire solo il comando per aggiornare il database:
In Esplora soluzioni fare doppio clic su Servizi connessi. Nell'area SQL Server Express LocalDB delle dipendenze del servizio selezionare i puntini di sospensione (...
) seguiti dal comando Aggiorna database .
Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente. Attendere che il campo Dei nomi delle classi DbContext venga aggiornato e che le migrazioni precedenti vengano caricate, che potrebbero richiedere alcuni secondi. Selezionare il pulsante Fine.
Selezionare il pulsante Chiudi al termine dell'operazione.
È possibile confermare l'applicazione di uno Identity schema con il comando seguente. L'output del comando include una colonna "applied
" per mostrare quali migrazioni vengono applicate al database.
Nella console di Visual Studio Gestione pacchetti eseguire Get-Migration
:
Get-Migration
Se esistono più contesti di database, specificare il contesto con il -Context
parametro .
Modifiche al layout
Facoltativo: aggiungere l'account di accesso parziale (_LoginPartial
) al file di layout:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] - WebRPnoAuth2Auth</title>
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
<link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
<link rel="stylesheet" href="~/WebRPnoAuth2Auth.styles.css" asp-append-version="true" />
</head>
<body>
<header>
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
<div class="container">
<a class="navbar-brand" asp-area="" asp-page="/Index">WebRPnoAuth2Auth</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
</li>
</ul>
<partial name="_LoginPartial" />
</div>
</div>
</nav>
</header>
<div class="container">
<main role="main" class="pb-3">
@RenderBody()
</main>
</div>
<footer class="border-top footer text-muted">
<div class="container">
© 2021 - WebRPnoAuth2Auth - <a asp-area="" asp-page="/Privacy">Privacy</a>
</div>
</footer>
<script src="~/lib/jquery/dist/jquery.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>
@await RenderSectionAsync("Scripts", required: false)
</body>
</html>
Eseguire lo scaffolding Identity in un Razor progetto con autorizzazione
Installare il pacchetto NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design
.
Nota
Per indicazioni sull'aggiunta di pacchetti alle app .NET, vedere gli articoli sotto Installare e gestire pacchetti in Flusso di lavoro dell'utilizzo di pacchetti (documentazione di NuGet). Confermare le versioni corrette del pacchetto all'indirizzo NuGet.org.
Eseguire lo Identity scaffolder:
- Da Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto >Aggiungi>nuovo elemento con scaffolding.
- Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Identity. Selezionare Identity nel riquadro centrale. Seleziona il pulsante Aggiungi.
- Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate.
- Se si dispone di una pagina di layout personalizzata esistente per Identity (
_Layout.cshtml
), selezionare la pagina di layout esistente per evitare di sovrascrivere il layout con markup errato dallo scaffolder. Ad esempio, selezionare:Pages/Shared/_Layout.cshtml
per Razor Pagine o Blazor Server progetti con l'infrastruttura Pages esistente Razor .Views/Shared/_Layout.cshtml
per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
- Per il contesto dati (classe DbContext):
- Selezionare la classe del contesto dati. È necessario selezionare almeno un file per aggiungere il contesto dati.
- Per creare un contesto dati ed eventualmente creare una nuova classe utente per Identity, selezionare il + pulsante . Accettare il valore predefinito o specificare una classe ,
Contoso.Data.ApplicationDbContext
ad esempio per una società denominata "Contoso". Per creare una nuova classe utente, selezionare il + pulsante Per classe User e specificare la classe (ad esempio,ContosoUser
per una società denominata "Contoso").
- Selezionare il pulsante Aggiungi per eseguire lo scaffolder.
- Se si dispone di una pagina di layout personalizzata esistente per Identity (
Eseguire lo scaffolding Identity in un progetto MVC senza autorizzazione esistente
Installare il pacchetto NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design
.
Nota
Per indicazioni sull'aggiunta di pacchetti alle app .NET, vedere gli articoli sotto Installare e gestire pacchetti in Flusso di lavoro dell'utilizzo di pacchetti (documentazione di NuGet). Confermare le versioni corrette del pacchetto all'indirizzo NuGet.org.
Eseguire lo Identity scaffolder:
- Da Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto >Aggiungi>nuovo elemento con scaffolding.
- Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Identity. Selezionare Identity nel riquadro centrale. Seleziona il pulsante Aggiungi.
- Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate.
- Se si dispone di una pagina di layout personalizzata esistente per Identity (
_Layout.cshtml
), selezionare la pagina di layout esistente per evitare di sovrascrivere il layout con markup errato dallo scaffolder. Ad esempio, selezionare:Pages/Shared/_Layout.cshtml
per Razor Pagine o Blazor Server progetti con l'infrastruttura Pages esistente Razor .Views/Shared/_Layout.cshtml
per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
- Per il contesto dati (classe DbContext):
- Selezionare la classe del contesto dati. È necessario selezionare almeno un file per aggiungere il contesto dati.
- Per creare un contesto dati ed eventualmente creare una nuova classe utente per Identity, selezionare il + pulsante . Accettare il valore predefinito o specificare una classe ,
Contoso.Data.ApplicationDbContext
ad esempio per una società denominata "Contoso". Per creare una nuova classe utente, selezionare il + pulsante Per classe User e specificare la classe (ad esempio,ContosoUser
per una società denominata "Contoso").
- Selezionare il pulsante Aggiungi per eseguire lo scaffolder.
- Se si dispone di una pagina di layout personalizzata esistente per Identity (
Facoltativo: aggiungere l'account di accesso parziale (_LoginPartial
) al Views/Shared/_Layout.cshtml
file:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] - WebRPnoAuth2Auth</title>
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
<link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
<link rel="stylesheet" href="~/WebRPnoAuth2Auth.styles.css" asp-append-version="true" />
</head>
<body>
<header>
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
<div class="container">
<a class="navbar-brand" asp-area="" asp-page="/Index">WebRPnoAuth2Auth</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
</li>
</ul>
<partial name="_LoginPartial" />
</div>
</div>
</nav>
</header>
<div class="container">
<main role="main" class="pb-3">
@RenderBody()
</main>
</div>
<footer class="border-top footer text-muted">
<div class="container">
© 2021 - WebRPnoAuth2Auth - <a asp-area="" asp-page="/Privacy">Privacy</a>
</div>
</footer>
<script src="~/lib/jquery/dist/jquery.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>
@await RenderSectionAsync("Scripts", required: false)
</body>
</html>
Il codice del database generato Identity richiede migrazioni Entity Framework (EF) Core. Se una migrazione per generare lo Identity schema non è stata creata e applicata al database, 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.
In Esplora soluzioni fare doppio clic su Servizi connessi. Nell'area SQL Server Express LocalDB delle dipendenze del servizio selezionare i puntini di sospensione (...
) seguiti da Aggiungi migrazione.
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 Dei nomi delle classi DbContext, che potrebbero richiedere alcuni secondi. Selezionare Fine per creare la migrazione.
Selezionare il pulsante Chiudi al termine dell'operazione.
Selezionare di nuovo i puntini di sospensione (...
) seguiti dal comando Aggiorna database .
Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente. Attendere che il campo Dei nomi delle classi DbContext venga aggiornato e che le migrazioni precedenti vengano caricate, che potrebbero richiedere alcuni secondi. Selezionare il pulsante Fine.
Selezionare il pulsante Chiudi al termine dell'operazione.
Il comando update database esegue le migrazioni del Up
metodo che non sono state applicate in un file di codice di migrazione creato dallo scaffolder. In questo caso, il comando esegue il Up
metodo nel Migrations/{TIME STAMP}_{MIGRATION NAME}.cs
file , che crea tabelle Identity , vincoli e indici. Il {TIME STAMP}
segnaposto è un timestamp e il {MIGRATION NAME}
segnaposto è il nome della migrazione.
Se lo Identity schema è già stato creato ma non applicato al database, è necessario eseguire solo il comando per aggiornare il database:
In Esplora soluzioni fare doppio clic su Servizi connessi. Nell'area SQL Server Express LocalDB delle dipendenze del servizio selezionare i puntini di sospensione (...
) seguiti dal comando Aggiorna database .
Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente. Attendere che il campo Dei nomi delle classi DbContext venga aggiornato e che le migrazioni precedenti vengano caricate, che potrebbero richiedere alcuni secondi. Selezionare il pulsante Fine.
Selezionare il pulsante Chiudi al termine dell'operazione.
È possibile confermare l'applicazione di uno Identity schema con il comando seguente. L'output del comando include una colonna "applied
" per mostrare quali migrazioni vengono applicate al database.
Nella console di Visual Studio Gestione pacchetti eseguire Get-Migration
:
Get-Migration
Se esistono più contesti di database, specificare il contesto con il -Context
parametro .
Aggiungere MapRazorPages
a Program.cs
come illustrato nel codice evidenziato seguente:
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebMVCauth.Data;
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddControllersWithViews();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapRazorPages();
app.Run();
Eseguire lo scaffolding Identity in un progetto MVC con autorizzazione
Installare il pacchetto NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design
.
Nota
Per indicazioni sull'aggiunta di pacchetti alle app .NET, vedere gli articoli sotto Installare e gestire pacchetti in Flusso di lavoro dell'utilizzo di pacchetti (documentazione di NuGet). Confermare le versioni corrette del pacchetto all'indirizzo NuGet.org.
Eseguire lo Identity scaffolder:
- Da Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto >Aggiungi>nuovo elemento con scaffolding.
- Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Identity. Selezionare Identity nel riquadro centrale. Seleziona il pulsante Aggiungi.
- Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate.
- Se si dispone di una pagina di layout personalizzata esistente per Identity (
_Layout.cshtml
), selezionare la pagina di layout esistente per evitare di sovrascrivere il layout con markup errato dallo scaffolder. Ad esempio, selezionare:Pages/Shared/_Layout.cshtml
per Razor Pagine o Blazor Server progetti con l'infrastruttura Pages esistente Razor .Views/Shared/_Layout.cshtml
per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
- Per il contesto dati (classe DbContext):
- Selezionare la classe del contesto dati. È necessario selezionare almeno un file per aggiungere il contesto dati.
- Per creare un contesto dati ed eventualmente creare una nuova classe utente per Identity, selezionare il + pulsante . Accettare il valore predefinito o specificare una classe ,
Contoso.Data.ApplicationDbContext
ad esempio per una società denominata "Contoso". Per creare una nuova classe utente, selezionare il + pulsante Per classe User e specificare la classe (ad esempio,ContosoUser
per una società denominata "Contoso").
- Selezionare il pulsante Aggiungi per eseguire lo scaffolder.
- Se si dispone di una pagina di layout personalizzata esistente per Identity (
Eseguire lo scaffolding Identity in un'app lato Blazor server con autorizzazione
Installare il pacchetto NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design
.
Nota
Per indicazioni sull'aggiunta di pacchetti alle app .NET, vedere gli articoli sotto Installare e gestire pacchetti in Flusso di lavoro dell'utilizzo di pacchetti (documentazione di NuGet). Confermare le versioni corrette del pacchetto all'indirizzo NuGet.org.
Eseguire lo Identity scaffolder:
- Da Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto >Aggiungi>nuovo elemento con scaffolding.
- Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Identity. Selezionare Identity nel riquadro centrale. Seleziona il pulsante Aggiungi.
- Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate.
- Se si dispone di una pagina di layout personalizzata esistente per Identity (
_Layout.cshtml
), selezionare la pagina di layout esistente per evitare di sovrascrivere il layout con markup errato dallo scaffolder. Ad esempio, selezionare:Pages/Shared/_Layout.cshtml
per Razor Pagine o Blazor Server progetti con l'infrastruttura Pages esistente Razor .Views/Shared/_Layout.cshtml
per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
- Per il contesto dati (classe DbContext):
- Selezionare la classe del contesto dati. È necessario selezionare almeno un file per aggiungere il contesto dati.
- Per creare un contesto dati ed eventualmente creare una nuova classe utente per Identity, selezionare il + pulsante . Accettare il valore predefinito o specificare una classe ,
Contoso.Data.ApplicationDbContext
ad esempio per una società denominata "Contoso". Per creare una nuova classe utente, selezionare il + pulsante Per classe User e specificare la classe (ad esempio,ContosoUser
per una società denominata "Contoso").
- Selezionare il pulsante Aggiungi per eseguire lo scaffolder.
- Se si dispone di una pagina di layout personalizzata esistente per Identity (
Migrazioni
Il codice del database generato Identity richiede migrazioni Entity Framework (EF) Core. Se una migrazione per generare lo Identity schema non è stata creata e applicata al database, 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.
In Esplora soluzioni fare doppio clic su Servizi connessi. Nell'area SQL Server Express LocalDB delle dipendenze del servizio selezionare i puntini di sospensione (...
) seguiti da Aggiungi migrazione.
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 Dei nomi delle classi DbContext, che potrebbero richiedere alcuni secondi. Selezionare Fine per creare la migrazione.
Selezionare il pulsante Chiudi al termine dell'operazione.
Selezionare di nuovo i puntini di sospensione (...
) seguiti dal comando Aggiorna database .
Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente. Attendere che il campo Dei nomi delle classi DbContext venga aggiornato e che le migrazioni precedenti vengano caricate, che potrebbero richiedere alcuni secondi. Selezionare il pulsante Fine.
Selezionare il pulsante Chiudi al termine dell'operazione.
Il comando update database esegue le migrazioni del Up
metodo che non sono state applicate in un file di codice di migrazione creato dallo scaffolder. In questo caso, il comando esegue il Up
metodo nel Migrations/{TIME STAMP}_{MIGRATION NAME}.cs
file , che crea tabelle Identity , vincoli e indici. Il {TIME STAMP}
segnaposto è un timestamp e il {MIGRATION NAME}
segnaposto è il nome della migrazione.
Se lo Identity schema è già stato creato ma non applicato al database, è necessario eseguire solo il comando per aggiornare il database:
In Esplora soluzioni fare doppio clic su Servizi connessi. Nell'area SQL Server Express LocalDB delle dipendenze del servizio selezionare i puntini di sospensione (...
) seguiti dal comando Aggiorna database .
Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente. Attendere che il campo Dei nomi delle classi DbContext venga aggiornato e che le migrazioni precedenti vengano caricate, che potrebbero richiedere alcuni secondi. Selezionare il pulsante Fine.
Selezionare il pulsante Chiudi al termine dell'operazione.
È possibile confermare l'applicazione di uno Identity schema con il comando seguente. L'output del comando include una colonna "applied
" per mostrare quali migrazioni vengono applicate al database.
Nella console di Visual Studio Gestione pacchetti eseguire Get-Migration
:
Get-Migration
Se esistono più contesti di database, specificare il contesto con il -Context
parametro .
Endpoint di autenticazione di stile
Poiché le app lato Blazor server usano Razor le pagine Pages Identity , lo stile dell'interfaccia utente cambia quando un visitatore si sposta tra Identity pagine e componenti. Sono disponibili due opzioni per affrontare gli stili incongrui:
Componenti personalizzati Identity
ASP.NET Core Identity è progettato per funzionare nel contesto della comunicazione di richiesta e risposta HTTP, che non è il modello di comunicazione client-server primario nelle Blazor app. Le app ASP.NET Core che usano ASP.NET Core Identity per la gestione utenti devono usare Razor Pages anziché componenti Razor per l'interfaccia utente correlata a Identity, ad esempio registrazione utente, accesso, disconnessione e altre attività di gestione utenti.
Poiché SignInManager<TUser> e UserManager<TUser> non sono supportati nei Razor componenti, è consigliabile usare l'API Web per gestire Identity le azioni dai Razor componenti tramite un'app abilitata sul lato Identityserver ASP.NET Core. Per indicazioni sulla creazione di API Web per Blazor le app, vedere Chiamare un'API Web da un'app ASP.NET CoreBlazor.
Un approccio all'uso Razor dei componenti per Identity invece delle Razor pagine consiste nel creare componenti personalizzati IdentityRazor , ma Microsoft non consiglia o supporta l'approccio. Per un contesto aggiuntivo, esplorare le discussioni seguenti. Nelle discussioni seguenti, gli esempi di codice nei commenti sui problemi e gli esempi di codice collegati tra i repository GitHub non Microsoft non sono supportati da Microsoft, ma potrebbero essere utili per alcuni sviluppatori:
- Supporto del componente di accesso personalizzato quando si usa Identity (dotnet/aspnetcore #13601)
SigninManager<T>
Il componente non è supportato in Razor Components (dotnet/aspnetcore #34095)- Non sono disponibili informazioni su come implementare effettivamente un modulo di accesso personalizzato per il lato blazor server (dotnet/AspNetCore.Docs #16813)
Per ulteriore assistenza quando si cerca di creare componenti personalizzati IdentityRazor o cercare componenti di terze parti Razor , è consigliabile usare le risorse seguenti:
- Stack Overflow (tag:
blazor
) (forum di supporto pubblico) - ASP.NET Core Slack Team (chat di supporto pubblico)
- Blazor Gitter (chat di supporto pubblico)
- Awesome Blazor (Collegamenti a risorse gestite dalla Blazor community)
Usare un layout personalizzato con Blazor gli stili dell'app
Il layout e gli stili delle Identity pagine possono essere modificati per produrre pagine che usano stili simili al tema predefinito Blazor . Questo approccio non è coperto dalla documentazione.
App lato Blazor client
Le app sul lato Blazor client usano approcci di interfaccia utente personalizzati Identity e non possono usare ASP.NET scaffolding core Identity . Le app principali ASP.NET lato server delle soluzioni ospitate Blazor possono seguire le Razor linee guida Pages/MVC in questo articolo e sono configurate esattamente come qualsiasi altro tipo di app ASP.NET Core che supporta Identity.
Il Blazor framework non include Razor le versioni dei componenti delle pagine dell'interfaccia Identity utente. Identity I componenti dell'interfaccia utente Razor possono essere creati o ottenuti da origini di terze parti non supportate.
Per altre informazioni, vedere gli Blazor articoli Sicurezza e Identity .
Creare un'origine completa Identity dell'interfaccia utente
Per mantenere il controllo completo dell'interfaccia Identity utente, eseguire lo Identity scaffolder e selezionare Sostituisci tutti i file.
Configurazione della password
Se PasswordOptions sono configurati in Startup.ConfigureServices
, [StringLength]
la configurazione dell'attributo potrebbe essere necessaria per la Password
proprietà nelle pagine con scaffolding Identity . 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>
Impostare come commento o rimuovere il collegamento di registrazione da
Areas/Identity/Pages/Account/Login.cshtml
@* <p> <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a> </p> *@
Aggiornare la
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'app console.
Il codice seguente descrive un approccio all'aggiunta di utenti:
- Un elenco di utenti viene letto in memoria.
- Per ogni utente viene generata una password univoca complessa.
- L'utente viene aggiunto al Identity database.
- L'utente riceve una notifica e comunica di modificare la password.
public class Program
{
public static void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
var context = services.GetRequiredService<AppDbCntx>();
context.Database.Migrate();
var config = host.Services.GetRequiredService<IConfiguration>();
var userList = config.GetSection("userList").Get<List<string>>();
SeedData.Initialize(services, userList).Wait();
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occurred adding users.");
}
}
host.Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
Il codice seguente descrive l'aggiunta di un utente:
public static async Task Initialize(IServiceProvider serviceProvider,
List<string> userList)
{
var userManager = serviceProvider.GetService<UserManager<IdentityUser>>();
foreach (var userName in userList)
{
var userPassword = GenerateSecurePassword();
var userId = await EnsureUser(userManager, userName, userPassword);
NotifyUser(userName, userPassword);
}
}
private static async Task<string> EnsureUser(UserManager<IdentityUser> userManager,
string userName, string userPassword)
{
var user = await userManager.FindByNameAsync(userName);
if (user == null)
{
user = new IdentityUser(userName)
{
EmailConfirmed = true
};
await userManager.CreateAsync(user, userPassword);
}
return user.Id;
}
È possibile seguire un approccio simile per gli scenari di produzione.
Impedire la pubblicazione di asset statici Identity
Per impedire la pubblicazione di asset statici Identity nella radice Web, vedere Introduzione a Identity in ASP.NET Core.
ASP.NET Core fornisce ASP.NET Core Identitycome libreria di Razor 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 e non usare l'RCL predefinito, vedere la sezione Creare l'origine completa Identity dell'interfaccia utente.
Le applicazioni che non includono l'autenticazione possono applicare lo scaffolder per aggiungere il pacchetto RCL Identity . È possibile selezionare Identity il codice da generare.
Anche se lo scaffolder genera la maggior parte del codice necessario, è necessario aggiornare il progetto per completare il processo. Questo documento illustra i passaggi necessari per completare un Identity aggiornamento dello scaffolding.
È consigliabile usare un sistema di controllo del codice sorgente che mostra le differenze tra i file e consente di eseguire il backup delle modifiche. Esaminare le modifiche dopo l'esecuzione dello Identity scaffolder.
I servizi sono necessari quando si usano Two Factor Authentication, la conferma dell'account e il ripristino delle password e altre funzionalità di sicurezza con Identity. I servizi o gli stub del servizio non vengono generati durante lo scaffolding Identitydi . I servizi per abilitare queste funzionalità devono essere aggiunti manualmente. Ad esempio, vedere Richiedi conferma tramite posta elettronica.
Quando si esegue lo scaffolding Identity con un nuovo contesto dati in un progetto con singoli account esistenti, 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 singoli account non devono creare un nuovo contesto dati.
Eseguire lo scaffolding Identity in un progetto vuoto
Eseguire lo Identity scaffolder:
- Da Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto >Aggiungi>nuovo elemento con scaffolding.
- Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Identity. Selezionare Identity nel riquadro centrale. Seleziona il pulsante Aggiungi.
- Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate.
- Se si dispone di una pagina di layout personalizzata esistente per Identity (
_Layout.cshtml
), selezionare la pagina di layout esistente per evitare di sovrascrivere il layout con markup errato dallo scaffolder. Ad esempio, selezionare:Pages/Shared/_Layout.cshtml
per Razor Pagine o Blazor Server progetti con l'infrastruttura Pages esistente Razor .Views/Shared/_Layout.cshtml
per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
- Per il contesto dati (classe DbContext):
- Selezionare la classe del contesto dati. È necessario selezionare almeno un file per aggiungere il contesto dati.
- Per creare un contesto dati ed eventualmente creare una nuova classe utente per Identity, selezionare il + pulsante . Accettare il valore predefinito o specificare una classe ,
Contoso.Data.ApplicationDbContext
ad esempio per una società denominata "Contoso". Per creare una nuova classe utente, selezionare il + pulsante Per classe User e specificare la classe (ad esempio,ContosoUser
per una società denominata "Contoso").
- Selezionare il pulsante Aggiungi per eseguire lo scaffolder.
- Se si dispone di una pagina di layout personalizzata esistente per Identity (
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 HTTP Strict Transport Security Protocol.
Il codice del database generato Identity richiede migrazioni Entity Framework (EF) Core. Se una migrazione per generare lo Identity schema non è stata creata e applicata al database, 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.
In Esplora soluzioni fare doppio clic su Servizi connessi. Nell'area SQL Server Express LocalDB delle dipendenze del servizio selezionare i puntini di sospensione (...
) seguiti da Aggiungi migrazione.
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 Dei nomi delle classi DbContext, che potrebbero richiedere alcuni secondi. Selezionare Fine per creare la migrazione.
Selezionare il pulsante Chiudi al termine dell'operazione.
Selezionare di nuovo i puntini di sospensione (...
) seguiti dal comando Aggiorna database .
Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente. Attendere che il campo Dei nomi delle classi DbContext venga aggiornato e che le migrazioni precedenti vengano caricate, che potrebbero richiedere alcuni secondi. Selezionare il pulsante Fine.
Selezionare il pulsante Chiudi al termine dell'operazione.
Il comando update database esegue le migrazioni del Up
metodo che non sono state applicate in un file di codice di migrazione creato dallo scaffolder. In questo caso, il comando esegue il Up
metodo nel Migrations/{TIME STAMP}_{MIGRATION NAME}.cs
file , che crea tabelle Identity , vincoli e indici. Il {TIME STAMP}
segnaposto è un timestamp e il {MIGRATION NAME}
segnaposto è il nome della migrazione.
Se lo Identity schema è già stato creato ma non applicato al database, è necessario eseguire solo il comando per aggiornare il database:
In Esplora soluzioni fare doppio clic su Servizi connessi. Nell'area SQL Server Express LocalDB delle dipendenze del servizio selezionare i puntini di sospensione (...
) seguiti dal comando Aggiorna database .
Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente. Attendere che il campo Dei nomi delle classi DbContext venga aggiornato e che le migrazioni precedenti vengano caricate, che potrebbero richiedere alcuni secondi. Selezionare il pulsante Fine.
Selezionare il pulsante Chiudi al termine dell'operazione.
È possibile confermare l'applicazione di uno Identity schema con il comando seguente. L'output del comando include una colonna "applied
" per mostrare quali migrazioni vengono applicate al database.
Nella console di Visual Studio Gestione pacchetti eseguire Get-Migration
:
Get-Migration
Se esistono più contesti di database, specificare il contesto con il -Context
parametro .
Eseguire lo scaffolding Identity in un Razor progetto senza autorizzazione esistente
Eseguire lo Identity scaffolder:
- Da Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto >Aggiungi>nuovo elemento con scaffolding.
- Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Identity. Selezionare Identity nel riquadro centrale. Seleziona il pulsante Aggiungi.
- Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate.
- Se si dispone di una pagina di layout personalizzata esistente per Identity (
_Layout.cshtml
), selezionare la pagina di layout esistente per evitare di sovrascrivere il layout con markup errato dallo scaffolder. Ad esempio, selezionare:Pages/Shared/_Layout.cshtml
per Razor Pagine o Blazor Server progetti con l'infrastruttura Pages esistente Razor .Views/Shared/_Layout.cshtml
per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
- Per il contesto dati (classe DbContext):
- Selezionare la classe del contesto dati. È necessario selezionare almeno un file per aggiungere il contesto dati.
- Per creare un contesto dati ed eventualmente creare una nuova classe utente per Identity, selezionare il + pulsante . Accettare il valore predefinito o specificare una classe ,
Contoso.Data.ApplicationDbContext
ad esempio per una società denominata "Contoso". Per creare una nuova classe utente, selezionare il + pulsante Per classe User e specificare la classe (ad esempio,ContosoUser
per una società denominata "Contoso").
- Selezionare il pulsante Aggiungi per eseguire lo scaffolder.
- Se si dispone di una pagina di layout personalizzata esistente per Identity (
Identity è configurato in Areas/Identity/IdentityHostingStartup.cs
. Per ulteriori informazioni, vedere IHostingStartup
.
Migrazioni, UseAuthentication e layout
Il codice del database generato Identity richiede migrazioni Entity Framework (EF) Core. Se una migrazione per generare lo Identity schema non è stata creata e applicata al database, 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.
In Esplora soluzioni fare doppio clic su Servizi connessi. Nell'area SQL Server Express LocalDB delle dipendenze del servizio selezionare i puntini di sospensione (...
) seguiti da Aggiungi migrazione.
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 Dei nomi delle classi DbContext, che potrebbero richiedere alcuni secondi. Selezionare Fine per creare la migrazione.
Selezionare il pulsante Chiudi al termine dell'operazione.
Selezionare di nuovo i puntini di sospensione (...
) seguiti dal comando Aggiorna database .
Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente. Attendere che il campo Dei nomi delle classi DbContext venga aggiornato e che le migrazioni precedenti vengano caricate, che potrebbero richiedere alcuni secondi. Selezionare il pulsante Fine.
Selezionare il pulsante Chiudi al termine dell'operazione.
Il comando update database esegue le migrazioni del Up
metodo che non sono state applicate in un file di codice di migrazione creato dallo scaffolder. In questo caso, il comando esegue il Up
metodo nel Migrations/{TIME STAMP}_{MIGRATION NAME}.cs
file , che crea tabelle Identity , vincoli e indici. Il {TIME STAMP}
segnaposto è un timestamp e il {MIGRATION NAME}
segnaposto è il nome della migrazione.
Se lo Identity schema è già stato creato ma non applicato al database, è necessario eseguire solo il comando per aggiornare il database:
In Esplora soluzioni fare doppio clic su Servizi connessi. Nell'area SQL Server Express LocalDB delle dipendenze del servizio selezionare i puntini di sospensione (...
) seguiti dal comando Aggiorna database .
Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente. Attendere che il campo Dei nomi delle classi DbContext venga aggiornato e che le migrazioni precedenti vengano caricate, che potrebbero richiedere alcuni secondi. Selezionare il pulsante Fine.
Selezionare il pulsante Chiudi al termine dell'operazione.
È possibile confermare l'applicazione di uno Identity schema con il comando seguente. L'output del comando include una colonna "applied
" per mostrare quali migrazioni vengono applicate al database.
Nella console di Visual Studio Gestione pacchetti eseguire Get-Migration
:
Get-Migration
Se esistono più contesti di database, specificare il contesto con il -Context
parametro .
Abilita autenticazione
Aggiornare la Startup
classe con codice simile al seguente:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
UseHsts
è una scelta consigliata ma non obbligatoria. Per altre informazioni, vedere HTTP Strict Transport Security Protocol.
Modifiche al layout
Facoltativo: aggiungere l'account di accesso parziale (_LoginPartial
) al file di layout:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] - WebRP</title>
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
<link rel="stylesheet" href="~/css/site.css" />
</head>
<body>
<header>
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
<div class="container">
<a class="navbar-brand" asp-area="" asp-page="/Index">WebRP</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
<partial name="_LoginPartial" />
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
</li>
</ul>
</div>
</div>
</nav>
</header>
<div class="container">
<main role="main" class="pb-3">
@RenderBody()
</main>
</div>
<footer class="border-top footer text-muted">
<div class="container">
© 2019 - WebRP - <a asp-area="" asp-page="/Privacy">Privacy</a>
</div>
</footer>
<script src="~/lib/jquery/dist/jquery.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>
@RenderSection("Scripts", required: false)
</body>
</html>
Eseguire lo scaffolding Identity in un Razor progetto con autorizzazione
Eseguire lo Identity scaffolder:
- Da Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto >Aggiungi>nuovo elemento con scaffolding.
- Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Identity. Selezionare Identity nel riquadro centrale. Seleziona il pulsante Aggiungi.
- Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate.
- Se si dispone di una pagina di layout personalizzata esistente per Identity (
_Layout.cshtml
), selezionare la pagina di layout esistente per evitare di sovrascrivere il layout con markup errato dallo scaffolder. Ad esempio, selezionare:Pages/Shared/_Layout.cshtml
per Razor Pagine o Blazor Server progetti con l'infrastruttura Pages esistente Razor .Views/Shared/_Layout.cshtml
per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
- Per il contesto dati (classe DbContext):
- Selezionare la classe del contesto dati. È necessario selezionare almeno un file per aggiungere il contesto dati.
- Per creare un contesto dati ed eventualmente creare una nuova classe utente per Identity, selezionare il + pulsante . Accettare il valore predefinito o specificare una classe ,
Contoso.Data.ApplicationDbContext
ad esempio per una società denominata "Contoso". Per creare una nuova classe utente, selezionare il + pulsante Per classe User e specificare la classe (ad esempio,ContosoUser
per una società denominata "Contoso").
- Selezionare il pulsante Aggiungi per eseguire lo scaffolder.
- Se si dispone di una pagina di layout personalizzata esistente per Identity (
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
Eseguire lo Identity scaffolder:
- Da Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto >Aggiungi>nuovo elemento con scaffolding.
- Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Identity. Selezionare Identity nel riquadro centrale. Seleziona il pulsante Aggiungi.
- Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate.
- Se si dispone di una pagina di layout personalizzata esistente per Identity (
_Layout.cshtml
), selezionare la pagina di layout esistente per evitare di sovrascrivere il layout con markup errato dallo scaffolder. Ad esempio, selezionare:Pages/Shared/_Layout.cshtml
per Razor Pagine o Blazor Server progetti con l'infrastruttura Pages esistente Razor .Views/Shared/_Layout.cshtml
per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
- Per il contesto dati (classe DbContext):
- Selezionare la classe del contesto dati. È necessario selezionare almeno un file per aggiungere il contesto dati.
- Per creare un contesto dati ed eventualmente creare una nuova classe utente per Identity, selezionare il + pulsante . Accettare il valore predefinito o specificare una classe ,
Contoso.Data.ApplicationDbContext
ad esempio per una società denominata "Contoso". Per creare una nuova classe utente, selezionare il + pulsante Per classe User e specificare la classe (ad esempio,ContosoUser
per una società denominata "Contoso").
- Selezionare il pulsante Aggiungi per eseguire lo scaffolder.
- Se si dispone di una pagina di layout personalizzata esistente per Identity (
Facoltativo: aggiungere l'account di accesso parziale (_LoginPartial
) al Views/Shared/_Layout.cshtml
file:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] - WebRP</title>
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
<link rel="stylesheet" href="~/css/site.css" />
</head>
<body>
<header>
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
<div class="container">
<a class="navbar-brand" asp-area="" asp-page="/Index">WebRP</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
<partial name="_LoginPartial" />
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
</li>
</ul>
</div>
</div>
</nav>
</header>
<div class="container">
<main role="main" class="pb-3">
@RenderBody()
</main>
</div>
<footer class="border-top footer text-muted">
<div class="container">
© 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 del database generato Identity richiede migrazioni Entity Framework (EF) Core. Se una migrazione per generare lo Identity schema non è stata creata e applicata al database, 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.
In Esplora soluzioni fare doppio clic su Servizi connessi. Nell'area SQL Server Express LocalDB delle dipendenze del servizio selezionare i puntini di sospensione (...
) seguiti da Aggiungi migrazione.
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 Dei nomi delle classi DbContext, che potrebbero richiedere alcuni secondi. Selezionare Fine per creare la migrazione.
Selezionare il pulsante Chiudi al termine dell'operazione.
Selezionare di nuovo i puntini di sospensione (...
) seguiti dal comando Aggiorna database .
Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente. Attendere che il campo Dei nomi delle classi DbContext venga aggiornato e che le migrazioni precedenti vengano caricate, che potrebbero richiedere alcuni secondi. Selezionare il pulsante Fine.
Selezionare il pulsante Chiudi al termine dell'operazione.
Il comando update database esegue le migrazioni del Up
metodo che non sono state applicate in un file di codice di migrazione creato dallo scaffolder. In questo caso, il comando esegue il Up
metodo nel Migrations/{TIME STAMP}_{MIGRATION NAME}.cs
file , che crea tabelle Identity , vincoli e indici. Il {TIME STAMP}
segnaposto è un timestamp e il {MIGRATION NAME}
segnaposto è il nome della migrazione.
Se lo Identity schema è già stato creato ma non applicato al database, è necessario eseguire solo il comando per aggiornare il database:
In Esplora soluzioni fare doppio clic su Servizi connessi. Nell'area SQL Server Express LocalDB delle dipendenze del servizio selezionare i puntini di sospensione (...
) seguiti dal comando Aggiorna database .
Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente. Attendere che il campo Dei nomi delle classi DbContext venga aggiornato e che le migrazioni precedenti vengano caricate, che potrebbero richiedere alcuni secondi. Selezionare il pulsante Fine.
Selezionare il pulsante Chiudi al termine dell'operazione.
È possibile confermare l'applicazione di uno Identity schema con il comando seguente. L'output del comando include una colonna "applied
" per mostrare quali migrazioni vengono applicate al database.
Nella console di Visual Studio Gestione pacchetti eseguire Get-Migration
:
Get-Migration
Se esistono più contesti di database, specificare il contesto con il -Context
parametro .
Aggiornare la Startup
classe con codice simile al seguente:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapRazorPages();
});
}
}
UseHsts
è una scelta consigliata ma non obbligatoria. Per altre informazioni, vedere HTTP Strict Transport Security Protocol.
Eseguire lo scaffolding Identity in un progetto MVC con autorizzazione
Eseguire lo Identity scaffolder:
- Da Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto >Aggiungi>nuovo elemento con scaffolding.
- Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Identity. Selezionare Identity nel riquadro centrale. Seleziona il pulsante Aggiungi.
- Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate.
- Se si dispone di una pagina di layout personalizzata esistente per Identity (
_Layout.cshtml
), selezionare la pagina di layout esistente per evitare di sovrascrivere il layout con markup errato dallo scaffolder. Ad esempio, selezionare:Pages/Shared/_Layout.cshtml
per Razor Pagine o Blazor Server progetti con l'infrastruttura Pages esistente Razor .Views/Shared/_Layout.cshtml
per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
- Per il contesto dati (classe DbContext):
- Selezionare la classe del contesto dati. È necessario selezionare almeno un file per aggiungere il contesto dati.
- Per creare un contesto dati ed eventualmente creare una nuova classe utente per Identity, selezionare il + pulsante . Accettare il valore predefinito o specificare una classe ,
Contoso.Data.ApplicationDbContext
ad esempio per una società denominata "Contoso". Per creare una nuova classe utente, selezionare il + pulsante Per classe User e specificare la classe (ad esempio,ContosoUser
per una società denominata "Contoso").
- Selezionare il pulsante Aggiungi per eseguire lo scaffolder.
- Se si dispone di una pagina di layout personalizzata esistente per Identity (
Eseguire lo scaffolding Identity in un'app lato Blazor server senza autorizzazione esistente
Eseguire lo Identity scaffolder:
- Da Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto >Aggiungi>nuovo elemento con scaffolding.
- Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Identity. Selezionare Identity nel riquadro centrale. Seleziona il pulsante Aggiungi.
- Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate.
- Se si dispone di una pagina di layout personalizzata esistente per Identity (
_Layout.cshtml
), selezionare la pagina di layout esistente per evitare di sovrascrivere il layout con markup errato dallo scaffolder. Ad esempio, selezionare:Pages/Shared/_Layout.cshtml
per Razor Pagine o Blazor Server progetti con l'infrastruttura Pages esistente Razor .Views/Shared/_Layout.cshtml
per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
- Per il contesto dati (classe DbContext):
- Selezionare la classe del contesto dati. È necessario selezionare almeno un file per aggiungere il contesto dati.
- Per creare un contesto dati ed eventualmente creare una nuova classe utente per Identity, selezionare il + pulsante . Accettare il valore predefinito o specificare una classe ,
Contoso.Data.ApplicationDbContext
ad esempio per una società denominata "Contoso". Per creare una nuova classe utente, selezionare il + pulsante Per classe User e specificare la classe (ad esempio,ContosoUser
per una società denominata "Contoso").
- Selezionare il pulsante Aggiungi per eseguire lo scaffolder.
- Se si dispone di una pagina di layout personalizzata esistente per Identity (
Identity è configurato in Areas/Identity/IdentityHostingStartup.cs
. Per ulteriori informazioni, vedere IHostingStartup
.
Migrazioni
Il codice del database generato Identity richiede migrazioni Entity Framework (EF) Core. Se una migrazione per generare lo Identity schema non è stata creata e applicata al database, 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.
In Esplora soluzioni fare doppio clic su Servizi connessi. Nell'area SQL Server Express LocalDB delle dipendenze del servizio selezionare i puntini di sospensione (...
) seguiti da Aggiungi migrazione.
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 Dei nomi delle classi DbContext, che potrebbero richiedere alcuni secondi. Selezionare Fine per creare la migrazione.
Selezionare il pulsante Chiudi al termine dell'operazione.
Selezionare di nuovo i puntini di sospensione (...
) seguiti dal comando Aggiorna database .
Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente. Attendere che il campo Dei nomi delle classi DbContext venga aggiornato e che le migrazioni precedenti vengano caricate, che potrebbero richiedere alcuni secondi. Selezionare il pulsante Fine.
Selezionare il pulsante Chiudi al termine dell'operazione.
Il comando update database esegue le migrazioni del Up
metodo che non sono state applicate in un file di codice di migrazione creato dallo scaffolder. In questo caso, il comando esegue il Up
metodo nel Migrations/{TIME STAMP}_{MIGRATION NAME}.cs
file , che crea tabelle Identity , vincoli e indici. Il {TIME STAMP}
segnaposto è un timestamp e il {MIGRATION NAME}
segnaposto è il nome della migrazione.
Se lo Identity schema è già stato creato ma non applicato al database, è necessario eseguire solo il comando per aggiornare il database:
In Esplora soluzioni fare doppio clic su Servizi connessi. Nell'area SQL Server Express LocalDB delle dipendenze del servizio selezionare i puntini di sospensione (...
) seguiti dal comando Aggiorna database .
Verrà visualizzata la finestra di dialogo Aggiorna database con la migrazione più recente. Attendere che il campo Dei nomi delle classi DbContext venga aggiornato e che le migrazioni precedenti vengano caricate, che potrebbero richiedere alcuni secondi. Selezionare il pulsante Fine.
Selezionare il pulsante Chiudi al termine dell'operazione.
È possibile confermare l'applicazione di uno Identity schema con il comando seguente. L'output del comando include una colonna "applied
" per mostrare quali migrazioni vengono applicate al database.
Nella console di Visual Studio Gestione pacchetti eseguire Get-Migration
:
Get-Migration
Se esistono più contesti di database, specificare il contesto con il -Context
parametro .
Endpoint di autenticazione di stile
Poiché le app lato Blazor server usano Razor le pagine Pages Identity , lo stile dell'interfaccia utente cambia quando un visitatore si sposta tra Identity pagine e componenti. Sono disponibili due opzioni per affrontare gli stili incongrui:
Componenti personalizzati Identity
Un approccio all'uso dei componenti per Identity invece delle pagine consiste nel creare Identity componenti. Poiché SignInManager
e UserManager
non sono supportati nei Razor componenti, usare gli endpoint API Web nell'app Blazor per elaborare le azioni dell'account utente.
Usare un layout personalizzato con Blazor gli stili dell'app
Il layout e gli stili delle Identity pagine possono essere modificati per produrre pagine che usano stili simili al tema predefinito Blazor . Questo approccio non è coperto dalla documentazione.
Eseguire lo scaffolding Identity in un'app lato Blazor server con autorizzazione
Eseguire lo Identity scaffolder:
- Da Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto >Aggiungi>nuovo elemento con scaffolding.
- Nel riquadro sinistro della finestra di dialogo Aggiungi nuovo elemento con scaffolding selezionare Identity. Selezionare Identity nel riquadro centrale. Seleziona il pulsante Aggiungi.
- Nella finestra di dialogo Aggiungi Identity selezionare le opzioni desiderate.
- Se si dispone di una pagina di layout personalizzata esistente per Identity (
_Layout.cshtml
), selezionare la pagina di layout esistente per evitare di sovrascrivere il layout con markup errato dallo scaffolder. Ad esempio, selezionare:Pages/Shared/_Layout.cshtml
per Razor Pagine o Blazor Server progetti con l'infrastruttura Pages esistente Razor .Views/Shared/_Layout.cshtml
per progetti o Blazor Server progetti MVC con infrastruttura MVC esistente.
- Per il contesto dati (classe DbContext):
- Selezionare la classe del contesto dati. È necessario selezionare almeno un file per aggiungere il contesto dati.
- Per creare un contesto dati ed eventualmente creare una nuova classe utente per Identity, selezionare il + pulsante . Accettare il valore predefinito o specificare una classe ,
Contoso.Data.ApplicationDbContext
ad esempio per una società denominata "Contoso". Per creare una nuova classe utente, selezionare il + pulsante Per classe User e specificare la classe (ad esempio,ContosoUser
per una società denominata "Contoso").
- Selezionare il pulsante Aggiungi per eseguire lo scaffolder.
- Se si dispone di una pagina di layout personalizzata esistente per Identity (
Alcune Identity opzioni sono configurate in Areas/Identity/IdentityHostingStartup.cs
. Per ulteriori informazioni, vedere IHostingStartup
.
App lato Blazor client
Le app sul lato Blazor client usano approcci di interfaccia utente personalizzati Identity e non possono usare ASP.NET scaffolding core Identity . Le app principali ASP.NET lato server delle soluzioni ospitate Blazor possono seguire le Razor linee guida Pages/MVC in questo articolo e sono configurate esattamente come qualsiasi altro tipo di app ASP.NET Core che supporta Identity.
Il Blazor framework non include Razor le versioni dei componenti delle pagine dell'interfaccia Identity utente. Identity I componenti dell'interfaccia utente Razor possono essere creati o ottenuti da origini di terze parti non supportate.
Per altre informazioni, vedere gli Blazor articoli Sicurezza e Identity .
Creare un'origine completa Identity dell'interfaccia utente
Per mantenere il controllo completo dell'interfaccia Identity utente, eseguire lo Identity scaffolder e selezionare Sostituisci tutti i file.
Il codice evidenziato seguente mostra le modifiche per sostituire l'interfaccia utente predefinita Identity con Identity in un'app Web ASP.NET Core 2.1. Potrebbe essere necessario eseguire questa operazione per avere il controllo completo dell'interfaccia Identity utente.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<IdentityUser, IdentityRole>()
// services.AddDefaultIdentity<IdentityUser>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddMvc()
.AddRazorPagesOptions(options =>
{
options.Conventions.AuthorizeAreaFolder("Identity", "/Account/Manage");
options.Conventions.AuthorizeAreaPage("Identity", "/Account/Logout");
});
services.ConfigureApplicationCookie(options =>
{
options.LoginPath = $"/Identity/Account/Login";
options.LogoutPath = $"/Identity/Account/Logout";
options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
});
// using Microsoft.AspNetCore.Identity.UI.Services;
services.AddSingleton<IEmailSender, EmailSender>();
}
Il valore predefinito Identity viene sostituito nel codice seguente:
services.AddIdentity<IdentityUser, IdentityRole>()
// services.AddDefaultIdentity<IdentityUser>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
Il codice seguente imposta LoginPath, LogoutPathe AccessDeniedPath:
services.ConfigureApplicationCookie(options =>
{
options.LoginPath = $"/Identity/Account/Login";
options.LogoutPath = $"/Identity/Account/Logout";
options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
});
Registrare un'implementazione IEmailSender
, ad esempio:
// using Microsoft.AspNetCore.Identity.UI.Services;
services.AddSingleton<IEmailSender, EmailSender>();
public class EmailSender : IEmailSender
{
public Task SendEmailAsync(string email, string subject, string message)
{
return Task.CompletedTask;
}
}
Configurazione della password
Se PasswordOptions sono configurati in Startup.ConfigureServices
, [StringLength]
la configurazione dell'attributo potrebbe essere necessaria per la Password
proprietà nelle pagine con scaffolding Identity . 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>
Impostare come commento o rimuovere il collegamento di registrazione da
Areas/Identity/Pages/Account/Login.cshtml
@* <p> <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a> </p> *@
Aggiornare la
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'app console.
Il codice seguente descrive un approccio all'aggiunta di utenti:
- Un elenco di utenti viene letto in memoria.
- Per ogni utente viene generata una password univoca complessa.
- L'utente viene aggiunto al Identity database.
- L'utente riceve una notifica e comunica di modificare la password.
public class Program
{
public static void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
var context = services.GetRequiredService<AppDbCntx>();
context.Database.Migrate();
var config = host.Services.GetRequiredService<IConfiguration>();
var userList = config.GetSection("userList").Get<List<string>>();
SeedData.Initialize(services, userList).Wait();
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occurred adding users.");
}
}
host.Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
Il codice seguente descrive l'aggiunta di un utente:
public static async Task Initialize(IServiceProvider serviceProvider,
List<string> userList)
{
var userManager = serviceProvider.GetService<UserManager<IdentityUser>>();
foreach (var userName in userList)
{
var userPassword = GenerateSecurePassword();
var userId = await EnsureUser(userManager, userName, userPassword);
NotifyUser(userName, userPassword);
}
}
private static async Task<string> EnsureUser(UserManager<IdentityUser> userManager,
string userName, string userPassword)
{
var user = await userManager.FindByNameAsync(userName);
if (user == null)
{
user = new IdentityUser(userName)
{
EmailConfirmed = true
};
await userManager.CreateAsync(user, userPassword);
}
return user.Id;
}
È possibile seguire un approccio simile per gli scenari di produzione.
Impedire la pubblicazione di asset statici Identity
Per impedire la pubblicazione di asset statici Identity nella radice Web, vedere Introduzione a Identity in ASP.NET Core.
Risorse aggiuntive
Modifiche apportate al codice di autenticazione in ASP.NET Core 2.1 e versioni successive