Introduzione all'identità di ASP.NET
Il sistema di appartenenza ASP.NET è stato introdotto con ASP.NET 2.0 nel 2005 e da allora sono state apportate molte modifiche nei modi in cui le applicazioni Web gestiscono in genere l'autenticazione e l'autorizzazione. ASP.NET Identity è una nuova occhiata a ciò che il sistema di appartenenza deve essere quando si creano applicazioni moderne per il Web, il telefono o il tablet.
È consigliabile usare l'opzione di autenticazione sicura più sicura. Per le app .NET distribuite in Azure, vedere:
Azure Key Vault e .NET Aspirare offrono il modo più sicuro per archiviare e recuperare i segreti. Azure Key Vault è un servizio cloud che protegge le chiavi di crittografia e i segreti, ad esempio certificati, stringhe di connessione e password. Per .NET Aspire, vedere Comunicazione sicura tra l'hosting e le integrazioni client.
Evitare la concessione delle credenziali della password del proprietario della risorsa perché:
- Espone la password dell'utente al client.
- È un rischio significativo per la sicurezza.
- Deve essere usato solo quando altri flussi di autenticazione non sono possibili.
Quando l'app viene distribuita in un server di test, è possibile usare una variabile di ambiente per impostare la stringa di connessione su un server di database di test. Le variabili di ambiente vengono in genere archiviate in testo normale e non crittografato. Se il computer o il processo è compromesso, è possibile accedere alle variabili di ambiente da parti non attendibili. Si sconsiglia di usare le variabili di ambiente per archiviare una stringa di connessione di produzione poiché non è l'approccio più sicuro.
Linee guida per i dati di configurazione:
- Non archiviare mai password o altri dati sensibili nel codice del provider di configurazione o nei file di configurazione di testo normale.
- Non usare segreti di produzione in ambienti di sviluppo o test.
- Specificare informazioni riservate fuori dal progetto in modo che non possano essere accidentalmente sottoposte a commit in un repository di codice sorgente.
Background: appartenenza a ASP.NET
Iscrizione ASP.NET
ASP.NET Membership è stata progettata per risolvere i requisiti di appartenenza al sito comuni nel 2005, che implicavano l'autenticazione basata su moduli e un database di SQL Server per nomi utente, password e dati del profilo. Oggi è disponibile un'ampia gamma di opzioni di archiviazione dei dati per le applicazioni Web e la maggior parte degli sviluppatori vuole consentire ai propri siti di usare provider di identità social per la funzionalità di autenticazione e autorizzazione. Le limitazioni della progettazione di ASP.NET Membership rendono difficile questa transizione:
- Lo schema del database è stato progettato per SQL Server e non è possibile modificarlo. È possibile aggiungere informazioni sul profilo, ma i dati aggiuntivi vengono inseriti in una tabella diversa, il che rende difficile l'accesso tramite altri mezzi, eccetto che attraverso l'API del Provider di Profili.
- Il sistema del provider consente di modificare l'archivio dati di backup, ma il sistema è progettato in base ai presupposti appropriati per un database relazionale. È possibile scrivere un provider per archiviare le informazioni di appartenenza in un meccanismo di archiviazione non relazionale, ad esempio tabelle di archiviazione di Azure, ma è necessario aggirare la progettazione relazionale scrivendo molto codice e molte eccezioni
System.NotImplementedException
per i metodi che non si applicano ai database NoSQL. - Poiché la funzionalità di accesso/disconnessione è basata sull'autenticazione basata su moduli, il sistema di gestione degli utenti non può usare OWIN. OWIN include componenti middleware per l'autenticazione, incluso il supporto per gli accessi tramite provider di identità esterni (ad esempio account Microsoft, Facebook, Google, Twitter) e accessi usando account aziendali da Active Directory locale o Azure Active Directory. OWIN include anche il supporto per OAuth 2.0, JWT e CORS.
ASP.NET'appartenenza semplice
ASP.NET Simple Membership è stato sviluppato come sistema di appartenenza per pagine web ASP.NET. È stato rilasciato con WebMatrix e Visual Studio 2010 SP1. L'obiettivo di Simple Membership era quello di semplificare l'aggiunta di funzionalità per membri a un'applicazione di pagine web.
L'appartenenza semplice ha semplificato la personalizzazione delle informazioni sul profilo utente, ma condivide comunque gli altri problemi relativi all'appartenenza ASP.NET e presenta alcune limitazioni:
- Era difficile rendere persistenti i dati del sistema di appartenenza in un archivio non relazionale.
- Non è possibile usarlo con OWIN.
- Non funziona bene con i provider di appartenenza ASP.NET esistenti e non è estendibile.
provider universali ASP.NET
ASP.NET i provider universali sono stati sviluppati per rendere persistenti le informazioni di appartenenza nel database SQL di Microsoft Azure e funzionano anche con SQL Server Compact. I provider universali sono stati basati su Entity Framework Code First, il che significa che i provider universali possono essere usati per rendere persistenti i dati in qualsiasi archivio supportato da ENTITY Framework. Con i provider universali, lo schema del database è stato notevolmente semplificato.
I provider universali sono basati sull'infrastruttura di appartenenza ASP.NET, quindi portano comunque le stesse limitazioni del provider SqlMembership. Ovvero sono stati progettati per i database relazionali ed è difficile personalizzare le informazioni sul profilo e sull'utente. Questi provider usano anche l'autenticazione basata su form per la funzionalità di accesso e disconnessione.
ASP.NET Identity
Come la storia di appartenenza in ASP.NET si è evoluta nel corso degli anni, il team ASP.NET ha imparato molto dal feedback dei clienti.
Il presupposto che gli utenti possano accedere immettendo un nome utente e una password registrati nella propria applicazione non sono più validi. Il Web è diventato più social. Gli utenti interagiscono tra loro in tempo reale attraverso canali social come Facebook, Twitter e altri siti Web social. Gli sviluppatori vogliono che gli utenti possano accedere con le proprie identità di social networking in modo che possano avere un'esperienza avanzata nei siti Web. Un sistema di adesione moderno deve consentire accessi basati su reindirizzamento ai provider di autenticazione, come Facebook, Twitter e altri.
Man mano che lo sviluppo web si è evoluto, anche i modelli di sviluppo web si sono evoluti. Gli unit test del codice dell'applicazione sono diventati un problema fondamentale per gli sviluppatori di applicazioni. Nel 2008 ASP.NET aggiunto un nuovo framework basato sul modello MVC (Model-View-Controller), in parte per aiutare gli sviluppatori a creare applicazioni di unit testable ASP.NET. Gli sviluppatori che volevano eseguire unit test della logica dell'applicazione volevano anche poter eseguire questa operazione con il sistema di appartenenza.
Considerando queste modifiche nello sviluppo di applicazioni Web, ASP.NET Identity è stata sviluppata con gli obiettivi seguenti:
Sistema di Identità Unica ASP.NET
- ASP.NET Identity può essere usato con tutti i framework ASP.NET, ad esempio ASP.NET MVC, Web Forms, Pagine Web, API Web e SignalR.
- ASP.NET Identity può essere utilizzato quando si creano applicazioni web, mobili, di archiviazione o ibride.
Facilità di integrazione dei dati del profilo utente
- Si ha il controllo sullo schema delle informazioni sull'utente e sul profilo. Ad esempio, è possibile abilitare facilmente il sistema per archiviare le date di nascita immesse dagli utenti quando registrano un account nell'applicazione.
controllo di persistenza
- Per impostazione predefinita, il sistema di identità ASP.NET archivia tutte le informazioni utente in un database. ASP.NET Identity usa Entity Framework Code First per implementare tutto il meccanismo di persistenza.
- Poiché si controlla lo schema del database, le attività comuni, ad esempio la modifica dei nomi di tabella o la modifica del tipo di dati delle chiavi primarie, sono semplici da eseguire.
- È facile collegare meccanismi di archiviazione diversi, ad esempio SharePoint, servizio tabelle di Archiviazione di Azure, database NoSQL e così via, senza dover generare eccezioni
System.NotImplementedExceptions
.
Testabilità delle unità
- ASP.NET Identity rende l'applicazione web più testabile a livello di unità. È possibile scrivere unit test per le parti dell'applicazione che usano ASP.NET Identity.
provider di ruoli
- Esiste un provider di ruoli che consente di limitare l'accesso a parti dell'applicazione in base ai ruoli. È possibile creare facilmente ruoli come "Amministratore" e aggiungere utenti ai ruoli.
basato sulle attestazioni
- ASP.NET Identity supporta l'autenticazione basata sulle attestazioni, in cui l'identità dell'utente è rappresentata come un set di attestazioni. Le attestazioni consentono agli sviluppatori di essere molto più espressivi nella descrizione dell'identità di un utente rispetto a quanto consentono i ruoli. Mentre l'appartenenza al ruolo è solo un valore booleano (membro o non membro), un'asserzione può includere informazioni ricche sull'identità e l'appartenenza dell'utente.
provider di accesso social
- È possibile aggiungere facilmente i log di social networking, ad esempio Account Microsoft, Facebook, Twitter, Google e altri all'applicazione e archiviare i dati specifici dell'utente nell'applicazione.
Integrazione OWIN
- L'autenticazione di ASP.NET è ora basata sul middleware OWIN che può essere usato in qualsiasi host basato su OWIN. ASP.NET Identity non ha alcuna dipendenza da System.Web. È un framework OWIN completamente conforme e può essere usato in qualsiasi applicazione ospitata OWIN.
- ASP.NET Identity usa l'autenticazione OWIN per l'accesso/disconnesso degli utenti nel sito Web. Ciò significa che invece di usare FormsAuthentication per generare il cookie, l'applicazione usa OWIN CookieAuthentication per farlo.
pacchetto NuGet
- ASP.NET Identity viene ridistribuito come pacchetto NuGet che viene installato nei modelli ASP.NET MVC, Web Form e API Web forniti con Visual Studio 2017. È possibile scaricare questo pacchetto NuGet dalla raccolta NuGet.
- Il rilascio di ASP.NET Identity come pacchetto NuGet rende più semplice per il team ASP.NET eseguire l'iterazione delle nuove funzionalità e delle correzioni di bug e distribuirli agli sviluppatori in modo agile.
Introduzione ad ASP.NET Identity
ASP.NET Identity viene usato nei modelli di progetto di Visual Studio 2017 per ASP.NET MVC, Web Form, API Web e SPA. In questa procedura dettagliata verrà illustrato come i modelli di progetto usano ASP.NET Identità per aggiungere funzionalità per registrare, accedere e disconnettere un utente.
ASP.NET Identity viene implementata usando la procedura seguente. Lo scopo di questo articolo è offrire una panoramica generale di ASP.NET Identity; è possibile seguirlo passo dopo passo o semplicemente leggere i dettagli. Per istruzioni più dettagliate sulla creazione di app con ASP.NET Identity, inclusa l'uso della nuova API per aggiungere utenti, ruoli e informazioni sul profilo, vedere la sezione Passaggi successivi alla fine di questo articolo.
Creare un'applicazione MVC ASP.NET con singoli account. È possibile usare ASP.NET Identity in ASP.NET MVC, Web Form, API Web, SignalR e così via. In questo articolo si inizierà con un'applicazione MVC ASP.NET.
Il progetto creato contiene i tre pacchetti seguenti per ASP.NET Identity.
Microsoft.AspNet.Identity.EntityFramework
Questo pacchetto include l'implementazione di Entity Framework di ASP.NET Identity, che consentirà di rendere persistenti i dati di ASP.NET Identity e lo schema in SQL Server.Microsoft.AspNet.Identity.Core
Questo pacchetto include le interfacce principali per ASP.NET Identity. Questo pacchetto può essere usato per scrivere un'implementazione per ASP.NET Identity destinata a archivi di persistenza diversi, ad esempio Archiviazione tabelle di Azure, database NoSQL e così via.Microsoft.AspNet.Identity.OWIN
Questo pacchetto contiene funzionalità usate per collegare l'autenticazione OWIN con ASP.NET Identity nelle applicazioni ASP.NET. Viene usato quando si aggiungono funzionalità di accesso all'applicazione e si chiama il middleware OWIN Cookie Authentication per generare un cookie.
Creazione di un utente.
Avviare l'applicazione e quindi fare clic sul collegamento Registra per creare un utente. L'immagine seguente mostra la pagina Registra che raccoglie il nome utente e la password.Quando l'utente seleziona il pulsante registra, l'azione
Register
del Controller Account crea l'utente chiamando l'API ASP.NET Identity, come evidenziato di seguito:[HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task<ActionResult> Register(RegisterViewModel model) { if (ModelState.IsValid) { var user = new ApplicationUser() { UserName = model.UserName }; var result = await UserManager.CreateAsync(user, model.Password); if (result.Succeeded) { await SignInAsync(user, isPersistent: false); return RedirectToAction("Index", "Home"); } else { AddErrors(result); } } // If we got this far, something failed, redisplay form return View(model); }
Accedi.
Se l'utente è stato creato correttamente, viene effettuato l'accesso tramite il metodoSignInAsync
.[HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task<ActionResult> Register(RegisterViewModel model) { if (ModelState.IsValid) { var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; var result = await UserManager.CreateAsync(user, model.Password); if (result.Succeeded) { await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false); // For more information on how to enable account confirmation and password reset please visit https://go.microsoft.com/fwlink/?LinkID=320771 // Send an email with this link // string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id); // var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme); // await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>"); return RedirectToAction("Index", "Home"); } AddErrors(result); } // If we got this far, something failed, redisplay form return View(model); }
Il metodo
SignInManager.SignInAsync
genera un ClaimsIdentity. Poiché ASP.NET Identity e l'autenticazione dei cookie OWIN sono sistemi basati sulle attestazioni, il framework richiede all'app di generare un ClaimsIdentity per l'utente. ClaimsIdentity contiene informazioni su tutte le rivendicazioni relative all'utente, come ad esempio i ruoli a cui appartiene.Notifica della partenza.
Selezionare il collegamento Disconnettersi per chiamare l'azione di Disconnessione nel controller dell'account.// POST: /Account/LogOff [HttpPost] [ValidateAntiForgeryToken] public ActionResult LogOff() { AuthenticationManager.SignOut(); return RedirectToAction("Index", "Home"); }
Il codice evidenziato sopra mostra il metodo OWIN
AuthenticationManager.SignOut
. Questo è analogo al metodo FormsAuthentication.SignOut utilizzato dal modulo FormsAuthentication in Web Forms.
Componenti dell'identità di ASP.NET
Il diagramma seguente mostra i componenti del sistema di identità ASP.NET (seleziona su questo o sul diagramma per ingrandirlo). I pacchetti in verde costituiscono il sistema di identità ASP.NET. Tutti gli altri pacchetti sono dipendenze necessarie per usare il sistema di identità ASP.NET nelle applicazioni ASP.NET.
Di seguito è riportata una breve descrizione dei pacchetti NuGet non menzionati in precedenza:
-
Microsoft.Owin.Security.Cookies
Middleware che consente a un'applicazione di usare l'autenticazione basata su cookie, simile all'autenticazione con Forms di ASP.NET. -
EntityFramework
Entity Framework è la tecnologia di accesso ai dati consigliata di Microsoft per i database relazionali.
Migrazione da Membership a ASP.NET Identity
Speriamo di fornire presto indicazioni sulla migrazione delle app esistenti che usano l'appartenenza ASP.NET o l'appartenenza semplice al nuovo sistema di identità ASP.NET.
Passaggi successivi
-
Creare un'app MVC 5 ASP.NET con Facebook e Google OAuth2 e OpenID Sign-On
L'esercitazione utilizza l'API Identity di ASP.NET per aggiungere informazioni sul profilo al database utente e autenticarsi con Google e Facebook. -
Creare un'app MVC ASP.NET con autenticazione e database SQL e distribuirla nel servizio app di Azure
Questa esercitazione illustra come usare l'API Identity per aggiungere utenti e ruoli. - https://github.com/rustd/AspnetIdentitySample
Applicazione di esempio che illustra come aggiungere ruoli di base e supporto per gli utenti e come eseguire ruoli e gestione degli utenti.