Introduzione ad ASP.NET Identity

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 Identità è un nuovo sguardo a ciò che il sistema di appartenenza deve essere quando si creano applicazioni moderne per il Web, il telefono o il tablet.

Background: appartenenza a ASP.NET

Appartenenza ASP.NET

ASP.NET l'appartenenza è stata progettata per risolvere i requisiti di appartenenza al sito comuni nel 2005, che hanno coinvolto l'autenticazione basata su form e un database SQL Server per nomi utente, password e dati del profilo. Oggi è disponibile una vasta 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 di ASP.NET progettazione dell'appartenenza 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 compressi in una tabella diversa, che rende difficile l'accesso tramite qualsiasi mezzo, ad eccezione dell'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 System.NotImplementedException 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 per i metodi che non si applicano ai database NoSQL.
  • Poiché la funzionalità di accesso/disconnessioni è basata sull'autenticazione basata su form, il sistema di appartenenza 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'appartenenza semplice è stata sviluppata come sistema di appartenenza per Pagine Web ASP.NET. È stato rilasciato con WebMatrix e Visual Studio 2010 SP1. L'obiettivo dell'appartenenza semplice era quello di semplificare l'aggiunta di funzionalità di appartenenza a un'applicazione 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 correttamente con i provider di appartenenza ASP.NET esistenti e non è estendibile.

Provider universali di ASP.NET

provider universali ASP.NET sono stati sviluppati per rendere persistenti le informazioni di appartenenza in 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 il provider universali può essere usato per rendere persistenti i dati in qualsiasi archivio supportato da EF. Con la provider universali, anche lo schema del database è stato pulito molto.

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 disconnesso.

Identità ASP.NET

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 esemeranno l'accesso 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 tramite 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 completa nei propri siti Web. Un sistema di appartenenza moderno deve abilitare i log in base al reindirizzamento a provider di autenticazione come Facebook, Twitter e altri.

Man mano che lo sviluppo Web si è evoluto, così ha fatto i modelli di sviluppo Web. L'unit test del codice dell'applicazione è diventato un problema fondamentale per gli sviluppatori di applicazioni. Nel 2008 ASP.NET aggiunto un nuovo framework basato sul modello Model-View-Controller (MVC), in parte per aiutare gli sviluppatori a creare applicazioni di unit testable ASP.NET. Anche gli sviluppatori che volevano eseguire unit test della logica dell'applicazione volevano 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:

  • Un sistema di identità ASP.NET

    • ASP.NET l'identità può essere usata con tutti i framework di ASP.NET, ad esempio ASP.NET MVC, Web Forms, pagine Web, API Web e SignalR.
    • ASP.NET l'identità può essere usata quando si creano applicazioni Web, telefoniche, store o ibride.
  • Facilità di collegamento ai dati del profilo sull'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 ASP.NET Identity 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 delle tabelle 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 System.NotImplementedExceptions eccezioni.
  • Unit testability

    • ASP.NET Identity rende l'applicazione Web più unit testabile. È 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 alle parti dell'applicazione in base ai ruoli. È possibile creare facilmente ruoli come "Amministrazione" 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 ai ruoli consentiti. Mentre l'appartenenza al ruolo è solo un valore booleano (membro o non membro), un'attestazione può includere informazioni dettagliate sull'identità e l'appartenenza dell'utente.
  • Provider di accesso di social networking

    • È possibile aggiungere facilmente log in social network, ad esempio Account Microsoft, Facebook, Twitter, Google e altri utenti all'applicazione e archiviare i dati specifici dell'utente nell'applicazione.
  • Integrazione OWIN

    • ASP.NET'autenticazione è 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 eseguire questa operazione.
  • Pacchetto NuGet

    • ASP.NET Identity viene ridistribuito come pacchetto NuGet installato nei modelli ASP.NET MVC, Web Forms 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 di ASP.NET eseguire l'iterazione delle nuove funzionalità e delle correzioni di bug e distribuirli agli sviluppatori in modo agile.

Introduzione all'identità di ASP.NET

ASP.NET Identity viene usato nei modelli di progetto di Visual Studio 2017 per ASP.NET MVC, Web Forms, API Web e SPA. In questa procedura dettagliata verrà illustrato come i modelli di progetto usano ASP.NET Identity per aggiungere funzionalità per registrare, accedere e disconnettere un utente.

ASP.NET l'identità viene implementata usando la procedura seguente. Lo scopo di questo articolo è offrire una panoramica generale di ASP.NET Identity; è possibile seguirlo passo per 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.

  1. Creare un'applicazione ASP.NET MVC con account singoli. È possibile usare ASP.NET Identity in ASP.NET MVC, Web Forms, API Web, SignalR e così via. In questo articolo si inizierà con un'applicazione MVC ASP.NET.

    Immagine della nuova finestra del progetto ASP dot Net

  2. 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 rende persistenti i dati e lo schema identity di ASP.NET per 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. Questo viene usato quando si aggiunge la funzionalità di accesso all'applicazione e si chiama il middleware OWIN Cookie Authentication per generare un cookie.
  3. 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.

    Immagine della creazione di un nuovo account

    Quando l'utente seleziona il pulsante Registra , l'azione Register del controller account crea l'utente chiamando l'API di identità ASP.NET, 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);
    }
    
  4. Accedere.
    Se l'utente è stato creato correttamente, l'utente ha eseguito l'accesso SignInAsync dal metodo .

     [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 SignInManager.SignInAsync metodo genera un claimsIdentity. Poiché ASP.NET l'autenticazione basata su identità e 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 attestazioni per l'utente, ad esempio a quali ruoli appartiene l'utente.

  5. Disconnettersi.
    Selezionare il collegamento Disconnettersi per chiamare l'azione LogOff 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 . Si tratta di un metodo analogo al metodo FormsAuthentication.SignOut usato dal modulo FormsAuthentication in Web Forms.

Componenti dell'identità di ASP.NET

Il diagramma seguente mostra i componenti del sistema di identità ASP.NET (selezionarlo o nel 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.

Diagramma che mostra i componenti del sistema di gestione delle identità A P dot 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 ad ASP. Autenticazione basata su form di NET.
  • EntityFramework
    Entity Framework è la tecnologia consigliata per l'accesso ai dati di Microsoft per i database relazionali.

Migrazione dall'appartenenza all'identità di ASP.NET

Ci auguriamo di fornire presto indicazioni sulla migrazione delle app esistenti che usano ASP.NET appartenenza o appartenenza semplice al nuovo sistema di identità ASP.NET.

Passaggi successivi