Introduzione ad ASP.NET IdentityIntroduction to ASP.NET Identity

Il sistema di appartenenze di ASP.NET è stato introdotto con ASP.NET 2,0 in 2005 e da allora sono state apportate molte modifiche nel modo in cui le applicazioni Web gestiscono in genere l'autenticazione e l'autorizzazione.The ASP.NET membership system was introduced with ASP.NET 2.0 back in 2005, and since then there have been many changes in the ways web applications typically handle authentication and authorization. ASP.NET Identity è un nuovo aspetto del sistema di appartenenze quando si compilano applicazioni moderne per il Web, il telefono o il tablet.ASP.NET Identity is a fresh look at what the membership system should be when you are building modern applications for the web, phone, or tablet.

Background: appartenenza a ASP.NETBackground: Membership in ASP.NET

Appartenenza ASP.NETASP.NET Membership

L'appartenenza a ASP.NET è stata progettata per risolvere i requisiti di appartenenza al sito comuni in 2005, che coinvolgono l'autenticazione basata su form e un database SQL Server per i nomi utente, le password e i dati di profilo.ASP.NET Membership was designed to solve site membership requirements that were common in 2005, which involved Forms Authentication, and a SQL Server database for user names, passwords, and profile data. Oggi esiste una gamma molto più ampia di opzioni di archiviazione dei dati per le applicazioni Web e la maggior parte degli sviluppatori desidera consentire ai propri siti di usare i provider di identità basati su social network per le funzionalità di autenticazione e autorizzazione.Today there is a much broader array of data storage options for web applications, and most developers want to enable their sites to use social identity providers for authentication and authorization functionality. Le limitazioni della progettazione dell'appartenenza a ASP.NET rendono questa transizione difficile:The limitations of ASP.NET Membership's design make this transition difficult:

  • Lo schema del database è stato progettato per SQL Server e non è possibile modificarlo.The database schema was designed for SQL Server and you can't change it. È possibile aggiungere informazioni sul profilo, ma i dati aggiuntivi vengono compressi in una tabella diversa, rendendo difficile l'accesso con qualsiasi mezzo, tranne tramite l'API del provider di profili.You can add profile information, but the additional data is packed into a different table, which makes it difficult to access by any means except through the Profile Provider API.
  • Il sistema di provider consente di modificare l'archivio dati di backup, ma il sistema è progettato in base ai presupposti appropriati per un database relazionale.The provider system enables you to change the backing data store, but the system is designed around assumptions appropriate for a relational database. È possibile scrivere un provider per archiviare le informazioni sull'appartenenza in un meccanismo di archiviazione non relazionale, ad esempio le tabelle di archiviazione di Azure, ma è necessario aggirare la progettazione relazionale scrivendo molto codice e molte System.NotImplementedException eccezioni per i metodi che non si applicano ai database NoSQL.You can write a provider to store membership information in a non-relational storage mechanism, such as Azure Storage Tables, but then you have to work around the relational design by writing much code and a lot of System.NotImplementedException exceptions for methods that don't apply to NoSQL databases.
  • Poiché la funzionalità di accesso/disconnessione è basata sull'autenticazione basata su form, il sistema di appartenenze non può usare OWIN.Since the log-in/log-out functionality is based on Forms Authentication, the membership system can't use 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 locali o Azure Active Directory.OWIN includes middleware components for authentication, including support for log-ins using external identity providers (like Microsoft Accounts, Facebook, Google, Twitter), and log-ins using organizational accounts from on-premises Active Directory or Azure Active Directory. OWIN include anche il supporto per OAuth 2,0, JWT e CORS.OWIN also includes support for OAuth 2.0, JWT and CORS.

Appartenenza semplice ASP.NETASP.NET Simple Membership

L'appartenenza a ASP.NET Simple è stata sviluppata come un sistema di appartenenza per pagine Web ASP.NET.ASP.NET simple membership was developed as a membership system for ASP.NET Web Pages. È stata rilasciata con WebMatrix e Visual Studio 2010 SP1.It was released with WebMatrix and Visual Studio 2010 SP1. L'obiettivo della semplice appartenenza è quello di semplificare l'aggiunta della funzionalità di appartenenza a un'applicazione Web Pages.The goal of Simple Membership was to make it easy to add membership functionality to a Web Pages application.

L'appartenenza semplice ha semplificato la personalizzazione delle informazioni del profilo utente, ma condivide comunque gli altri problemi con l'appartenenza a ASP.NET e presenta alcune limitazioni:Simple Membership did make it easier to customize user profile information, but it still shares the other problems with ASP.NET Membership, and it has some limitations:

  • Era difficile salvare i dati di sistema di appartenenza in un archivio non relazionale.It was hard to persist membership system data in a non-relational store.
  • Non è possibile usarlo con OWIN.You can't use it with OWIN.
  • Non funziona bene con i provider di appartenenze ASP.NET esistenti e non è estendibile.It doesn't work well with existing ASP.NET Membership providers, and it's not extensible.

Provider universali di ASP.NETASP.NET Universal Providers

Provider universali ASP.NET sono state sviluppate per rendere possibile la persistenza delle informazioni di appartenenza in database SQL di Microsoft Azure e funzionano anche con SQL Server Compact.ASP.NET Universal Providers were developed to make it possible to persist membership information in Microsoft Azure SQL Database, and they also work with SQL Server Compact. I provider universali sono basati su Entity Framework Code First, il che significa che il provider universali può essere usato per salvare in modo permanente i dati in qualsiasi archivio supportato da EF.The Universal Providers were built on Entity Framework Code First, which means that the Universal Providers can be used to persist data in any store supported by EF. Con il provider universali, anche lo schema del database è stato pulito molto.With the Universal Providers, the database schema was cleaned up quite a lot as well.

I provider universali si basano sull'infrastruttura di appartenenza ASP.NET, quindi continuano a avere le stesse limitazioni del provider sqlmemberment.The Universal Providers are built on the ASP.NET Membership infrastructure, so they still carry the same limitations as the SqlMembership Provider. Ovvero sono stati progettati per i database relazionali ed è difficile personalizzare le informazioni relative a profili e utenti.That is, they were designed for relational databases and it's hard to customize profile and user information. Questi provider utilizzano ancora l'autenticazione basata su form per la funzionalità di accesso e disconnessione.These providers also still use Forms Authentication for sign-in and sign-out functionality.

Identità ASP.NETASP.NET Identity

Man mano che la storia di appartenenza a ASP.NET si è evoluta nel corso degli anni, il team di ASP.NET ha imparato molto da feedback dai clienti.As the membership story in ASP.NET has evolved over the years, the ASP.NET team has learned a lot from feedback from customers.

Il presupposto che gli utenti effettueranno l'accesso immettendo un nome utente e una password registrati nella propria applicazione non è più valido.The assumption that users will sign in by entering a user name and password that they have registered in your own application is no longer valid. Il Web è diventato più social.The web has become more social. Gli utenti interagiscono tra loro in tempo reale tramite canali di social networking, ad esempio Facebook, Twitter e altri siti Web di social networking.Users are interacting with each other in real time through social channels such as Facebook, Twitter, and other social web sites. Gli sviluppatori desiderano che gli utenti siano in grado di accedere con le proprie identità social, in modo che possano avere un'esperienza avanzata sui propri siti Web.Developers want users to be able to sign in with their social identities so that they can have a rich experience on their web sites. Un sistema di appartenenza moderno deve consentire accessi basati sul reindirizzamento a provider di autenticazione, ad esempio Facebook, Twitter e altri.A modern membership system must enable redirection-based log-ins to authentication providers such as Facebook, Twitter, and others.

Man mano che lo sviluppo Web si è evoluto, sono stati sviluppati i modelli dello sviluppo Web.As web development evolved, so did the patterns of web development. Il testing unità del codice dell'applicazione è diventato un problema principale per gli sviluppatori di applicazioni.Unit testing of application code became a core concern for application developers. In 2008 ASP.NET è stato aggiunto un nuovo Framework basato sul modello MVC (Model-View-Controller), in parte per aiutare gli sviluppatori a compilare applicazioni ASP.NET di unità testabili.In 2008 ASP.NET added a new framework based on the Model-View-Controller (MVC) pattern, in part to help developers build unit testable ASP.NET applications. Gli sviluppatori che volevano unit test la logica dell'applicazione volevano anche essere in grado di eseguire questa operazione con il sistema di appartenenze.Developers who wanted to unit test their application logic also wanted to be able to do that with the membership system.

Tenendo conto delle modifiche apportate allo sviluppo di applicazioni Web, ASP.NET Identity è stato sviluppato con gli obiettivi seguenti:Considering these changes in web application development, ASP.NET Identity was developed with the following goals:

  • Un sistema ASP.NET IdentityOne ASP.NET Identity system

    • ASP.NET Identity possono essere usati con tutti i framework ASP.NET, ad esempio ASP.NET MVC, Web Forms, Web Pages, Web API e SignalR.ASP.NET Identity can be used with all of the ASP.NET frameworks, such as ASP.NET MVC, Web Forms, Web Pages, Web API, and SignalR.
    • È possibile utilizzare ASP.NET Identity durante la compilazione di applicazioni Web, di telefoni, di archiviazione o ibride.ASP.NET Identity can be used when you are building web, phone, store, or hybrid applications.
  • Facilità di inserimento dei dati di profilo sull'utenteEase of plugging in profile data about the user

    • Si ha il controllo dello schema delle informazioni sull'utente e sul profilo.You have control over the schema of user and profile information. Ad esempio, è possibile abilitare facilmente il sistema per archiviare le date di nascita immesse dagli utenti durante la registrazione di un account nell'applicazione.For example, you can easily enable the system to store birth dates entered by users when they register an account in your application.
  • Controllo di persistenzaPersistence control

    • Per impostazione predefinita, il sistema ASP.NET Identity archivia tutte le informazioni utente in un database.By default, the ASP.NET Identity system stores all the user information in a database. ASP.NET Identity utilizza Entity Framework Code First per implementare tutto il meccanismo di persistenza.ASP.NET Identity uses Entity Framework Code First to implement all of its persistence mechanism.
    • 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.Since you control the database schema, common tasks such as changing table names or changing the data type of primary keys is simple to do.
    • È 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.It's easy to plug in different storage mechanisms such as SharePoint, Azure Storage Table Service, NoSQL databases, etc., without having to throw System.NotImplementedExceptions exceptions.
  • Testing unitàUnit testability

    • ASP.NET Identity rende l'applicazione Web più testabile unità.ASP.NET Identity makes the web application more unit testable. È possibile scrivere unit test per le parti dell'applicazione che usano ASP.NET Identity.You can write unit tests for the parts of your application that use ASP.NET Identity.
  • Provider di ruoliRole provider

    • È disponibile un provider di ruoli che consente di limitare l'accesso a parti dell'applicazione in base ai ruoli.There is a role provider which lets you restrict access to parts of your application by roles. È possibile creare facilmente ruoli quali "amministrazione" e aggiungere utenti ai ruoli.You can easily create roles such as "Admin" and add users to roles.
  • Basata su attestazioniClaims Based

    • ASP.NET Identity supporta l'autenticazione basata sulle attestazioni, in cui l'identità dell'utente è rappresentata come un set di attestazioni.ASP.NET Identity supports claims-based authentication, where the user's identity is represented as a set of claims. Le attestazioni consentono agli sviluppatori di essere molto più espressive nell'descrivere l'identità di un utente rispetto ai ruoli consentiti.Claims allow developers to be a lot more expressive in describing a user's identity than roles allow. 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.Whereas role membership is just a boolean (member or non-member), a claim can include rich information about the user's identity and membership.
  • Provider di accesso di social networkingSocial Login Providers

    • È possibile aggiungere facilmente accessi di social networking, ad esempio account Microsoft, Facebook, Twitter, Google e altri, all'applicazione e archiviare i dati specifici dell'utente nell'applicazione.You can easily add social log-ins such as Microsoft Account, Facebook, Twitter, Google, and others to your application, and store the user-specific data in your application.
  • Integrazione OWINOWIN Integration

    • L'autenticazione ASP.NET è ora basata sul middleware OWIN che può essere usato in qualsiasi host basato su OWIN.ASP.NET authentication is now based on OWIN middleware that can be used on any OWIN-based host. ASP.NET Identity non dispone di alcuna dipendenza da System. Web.ASP.NET Identity does not have any dependency on System.Web. Si tratta di un Framework OWIN completamente compatibile e può essere usato in qualsiasi applicazione ospitata da OWIN.It is a fully compliant OWIN framework and can be used in any OWIN hosted application.
    • ASP.NET Identity usa l'autenticazione OWIN per l'accesso o la disconnessione degli utenti nel sito Web.ASP.NET Identity uses OWIN Authentication for log-in/log-out of users in the web site. Ciò significa che invece di usare FormsAuthentication per generare il cookie, l'applicazione usa OWIN CookieAuthentication a tale scopo.This means that instead of using FormsAuthentication to generate the cookie, the application uses OWIN CookieAuthentication to do that.
  • Pacchetto NuGetNuGet package

    • ASP.NET Identity viene ridistribuito come pacchetto NuGet installato nei modelli di ASP.NET MVC, Web Form e API Web forniti con Visual Studio 2017.ASP.NET Identity is redistributed as a NuGet package which is installed in the ASP.NET MVC, Web Forms and Web API templates that ship with Visual Studio 2017. È possibile scaricare il pacchetto NuGet dalla raccolta NuGet.You can download this NuGet package from the NuGet gallery.
    • Il rilascio di ASP.NET Identity come pacchetto NuGet rende più semplice per il team ASP.NET l'iterazione delle nuove funzionalità e delle correzioni di bug e la distribuzione degli sviluppatori in modo agile.Releasing ASP.NET Identity as a NuGet package makes it easier for the ASP.NET team to iterate on new features and bug fixes, and deliver these to developers in an agile manner.

Inizia a usare ASP.NET IdentityGet started with ASP.NET Identity

ASP.NET Identity viene usato nei modelli di progetto di Visual Studio 2017 per ASP.NET MVC, Web Forms, Web API e SPA.ASP.NET Identity is used in the Visual Studio 2017 project templates for ASP.NET MVC, Web Forms, Web API and SPA. In questa procedura dettagliata verrà illustrato il modo in cui i modelli di progetto usano ASP.NET Identity per aggiungere funzionalità per la registrazione, l'accesso e la disconnessione di un utente.In this walkthrough, we'll illustrate how the project templates use ASP.NET Identity to add functionality to register, sign in and sign out a user.

ASP.NET Identity viene implementato utilizzando la procedura riportata di seguito.ASP.NET Identity is implemented using the following procedure. Lo scopo di questo articolo è fornire una panoramica di alto livello di ASP.NET Identity; è possibile seguire questa procedura dettagliata o leggere semplicemente i dettagli.The purpose of this article is to give you a high level overview of ASP.NET Identity; you can follow it step by step or just read the details. Per istruzioni più dettagliate sulla creazione di app con ASP.NET Identity, tra cui l'uso della nuova API per aggiungere utenti, ruoli e informazioni sul profilo, vedere la sezione passaggi successivi alla fine di questo articolo.For more detailed instructions on creating apps using ASP.NET Identity, including using the new API to add users, roles and profile information, see the Next Steps section at the end of this article.

  1. Creare un'applicazione MVC ASP.NET con singoli account.Create an ASP.NET MVC application with Individual Accounts. È possibile usare ASP.NET Identity in ASP.NET MVC, Web Form, API Web, SignalR e così via. In questo articolo verrà avviata un'applicazione MVC ASP.NET.You can use ASP.NET Identity in ASP.NET MVC, Web Forms, Web API, SignalR etc. In this article we will start with an ASP.NET MVC application.

  2. Il progetto creato contiene i tre pacchetti seguenti per ASP.NET Identity.The created project contains the following three packages for ASP.NET Identity.

    • Microsoft.AspNet.Identity.EntityFramework
      Questo pacchetto include l'implementazione del Entity Framework di ASP.NET Identity che renderà permanente i dati e lo schema di ASP.NET Identity SQL Server.This package has the Entity Framework implementation of ASP.NET Identity which will persist the ASP.NET Identity data and schema to SQL Server.
    • Microsoft.AspNet.Identity.Core
      Questo pacchetto contiene le interfacce principali per ASP.NET Identity.This package has the core interfaces for ASP.NET Identity. Questo pacchetto può essere usato per scrivere un'implementazione per ASP.NET Identity destinata a diversi archivi di persistenza, ad esempio l'archiviazione tabelle di Azure, i database NoSQL e così via.This package can be used to write an implementation for ASP.NET Identity that targets different persistence stores such as Azure Table Storage, NoSQL databases etc.
    • Microsoft.AspNet.Identity.OWIN
      Questo pacchetto contiene la funzionalità usata per inserire l'autenticazione OWIN con ASP.NET Identity nelle applicazioni ASP.NET.This package contains functionality that is used to plug in OWIN authentication with ASP.NET Identity in ASP.NET applications. Viene usato quando si aggiungono funzionalità di accesso all'applicazione e si chiama il middleware di autenticazione del cookie OWIN per generare un cookie.This is used when you add sign in functionality to your application and call into OWIN Cookie Authentication middleware to generate a cookie.
  3. Creazione di un utente.Creating a user.
    Avviare l'applicazione e fare clic sul collegamento Register (registra ) per creare un utente.Launch the application and then click on the Register link to create a user. La figura seguente mostra la pagina Register che raccoglie il nome utente e la password.The following image shows the Register page that collects the user name and password.

    Quando l'utente seleziona il pulsante Register , l'azione Register del controller di account crea l'utente chiamando l'API ASP.NET Identity, come indicato di seguito:When the user selects the Register button, the Register action of the Account controller creates the user by calling the ASP.NET Identity API, as highlighted below:

    [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.Sign in.
    Se l'utente è stato creato correttamente, ha eseguito l'accesso con il metodo SignInAsync.If the user was successfully created, she is signed in by the SignInAsync method.

     [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.The SignInManager.SignInAsync method generates a ClaimsIdentity. Poiché l'autenticazione dei cookie ASP.NET Identity e OWIN è un sistema basato su attestazioni, il Framework richiede che l'app generi un ClaimsIdentity per l'utente.Since ASP.NET Identity and OWIN Cookie Authentication are claims-based system, the framework requires the app to generate a ClaimsIdentity for the user. ClaimsIdentity contiene informazioni su tutte le attestazioni per l'utente, ad esempio i ruoli a cui appartiene l'utente.ClaimsIdentity has information about all the claims for the user, such as what roles the user belongs to.

  5. Esegue la disconnessione.Log off.
    Selezionare il collegamento Disconnetti per chiamare l'azione di disconnessione nel controller account.Select the Log off link to call the LogOff action in the account controller.

    // POST: /Account/LogOff
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult LogOff()
    {
        AuthenticationManager.SignOut();
        return RedirectToAction("Index", "Home");
    }
    

    Il codice evidenziato sopra illustra il metodo di AuthenticationManager.SignOut OWIN.The highlighted code above shows the OWIN AuthenticationManager.SignOut method. Questo è analogo al metodo FormsAuthentication. Sign out usato dal modulo FormsAuthentication in Web Form.This is analogous to FormsAuthentication.SignOut method used by the FormsAuthentication module in Web Forms.

Componenti di ASP.NET IdentityComponents of ASP.NET Identity

Il diagramma seguente illustra i componenti del sistema di ASP.NET Identity (selezionare su questo o sul diagramma per ingrandirlo).The diagram below shows the components of the ASP.NET Identity system (select on this or on the diagram to enlarge it). I pacchetti in verde costituiscono il sistema di ASP.NET Identity.The packages in green make up the ASP.NET Identity system. Tutti gli altri pacchetti sono dipendenze necessarie per usare il sistema ASP.NET Identity nelle applicazioni ASP.NET.All the other packages are dependencies which are needed to use the ASP.NET Identity system in ASP.NET applications.

Di seguito è riportata una breve descrizione dei pacchetti NuGet non citati in precedenza:The following is a brief description of the NuGet packages not mentioned previously:

  • Microsoft.Owin.Security.CookiesMicrosoft.Owin.Security.Cookies
    Middleware che consente a un'applicazione di usare l'autenticazione basata su cookie, simile a ASP. Autenticazione basata su form di NET.Middleware that enables an application to use cookie based authentication, similar to ASP.NET's Forms Authentication.
  • EntityFrameworkEntityFramework
    Entity Framework è la tecnologia di accesso ai dati consigliata da Microsoft per i database relazionali.Entity Framework is Microsoft's recommended data access technology for relational databases.

Migrazione dall'appartenenza a ASP.NET IdentityMigrating from Membership to ASP.NET Identity

Ci auguriamo di fornire presto informazioni aggiuntive sulla migrazione delle app esistenti che usano l'appartenenza a ASP.NET o l'appartenenza semplice al nuovo sistema di ASP.NET Identity.We hope to soon provide guidance on migrating your existing apps that use ASP.NET Membership or Simple Membership to the new ASP.NET Identity system.

Passaggi successiviNext Steps