Aggiunta di ASP.NET Identity a un progetto Web Forms vuoto o esistente

Questa esercitazione illustra come aggiungere ASP.NET Identity (il nuovo sistema di appartenenza per ASP.NET) a un'applicazione ASP.NET.

Quando si crea un nuovo progetto Web Form o MVC in Visual Studio 2017 RTM con singoli account, Visual Studio installerà tutti i pacchetti necessari e aggiungerà tutte le classi necessarie. In questa esercitazione vengono illustrati i passaggi per aggiungere ASP.NET Identity supporto al progetto Web Form esistente o a un nuovo progetto vuoto. Illustrerò tutti i pacchetti NuGet che è necessario installare e le classi da aggiungere. Verranno esaminati i Web Form di esempio per la registrazione di nuovi utenti e l'accesso, evidenziando tutte le API principali del punto di ingresso per la gestione e l'autenticazione degli utenti. In questo esempio verrà utilizzata l'implementazione predefinita di ASP.NET Identity per l'archiviazione di dati SQL basata su Entity Framework. In questa esercitazione verrà usato il database locale per il database SQL.

Inizia a usare ASP.NET Identity

  1. Per iniziare, installare ed eseguire Visual Studio 2017.

  2. Selezionare nuovo progetto dalla pagina iniziale oppure è possibile usare il menu e selezionare file, quindi nuovo progetto.

  3. Nel riquadro sinistro espandere oggetto visivo C# , quindi selezionare Web, quindi applicazione Web ASP.NET (.NET Framework) . Assegnare al progetto il nome "WebFormsIdentity" e fare clic su OK.

  4. Nella finestra di dialogo nuovo progetto ASP.NET selezionare il modello vuoto .

    Si noti che il pulsante Cambia autenticazione è disabilitato e non è disponibile alcun supporto per l'autenticazione in questo modello. I modelli Web Form, MVC e API Web consentono di selezionare l'approccio di autenticazione.

Aggiungere pacchetti di identità all'app

In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e scegliere Gestisci pacchetti NuGet. Cercare e installare il pacchetto Microsoft. AspNet. Identity. EntityFramework .

Si noti che questo pacchetto installerà i pacchetti di dipendenza: EntityFramework e Microsoft ASP.NET Identity Core.

Aggiungere un Web Form per registrare gli utenti

  1. In Esplora soluzionifare clic con il pulsante destro del mouse sul progetto e scegliere Aggiungi, quindi Web Form.

  2. Nella finestra di dialogo Specifica nome per l'elemento assegnare un nome al nuovo RegistroWeb Form, quindi selezionare OK .

  3. Sostituire il markup nel file Register. aspx generato con il codice riportato di seguito. Le modifiche al codice sono evidenziate.

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Register.aspx.cs" Inherits="WebFormsIdentity.Register" %>
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body style="font-family: Arial, Helvetica, sans-serif; font-size: small">
        <form id="form1" runat="server">
        <div>
            <h4 style="font-size: medium">Register a new user</h4>
            <hr />
            <p>
                <asp:Literal runat="server" ID="StatusMessage" />
            </p>                
            <div style="margin-bottom:10px">
                <asp:Label runat="server" AssociatedControlID="UserName">User name</asp:Label>
                <div>
                    <asp:TextBox runat="server" ID="UserName" />                
                </div>
            </div>
            <div style="margin-bottom:10px">
                <asp:Label runat="server" AssociatedControlID="Password">Password</asp:Label>
                <div>
                    <asp:TextBox runat="server" ID="Password" TextMode="Password" />                
                </div>
            </div>
            <div style="margin-bottom:10px">
                <asp:Label runat="server" AssociatedControlID="ConfirmPassword">Confirm password</asp:Label>
                <div>
                    <asp:TextBox runat="server" ID="ConfirmPassword" TextMode="Password" />                
                </div>
            </div>
            <div>
                <div>
                    <asp:Button runat="server" OnClick="CreateUser_Click" Text="Register" />
                </div>
            </div>
        </div>
        </form>
    </body>
    </html>
    

    Note

    Si tratta semplicemente di una versione semplificata del file Register. aspx creato quando si crea un nuovo progetto Web Form ASP.NET. Il markup precedente aggiunge campi del modulo e un pulsante per registrare un nuovo utente.

  4. Aprire il file Register.aspx.cs e sostituire il contenuto del file con il codice seguente:

    using Microsoft.AspNet.Identity;
    using Microsoft.AspNet.Identity.EntityFramework;
    using System;
    using System.Linq;
    
    namespace WebFormsIdentity
    {
       public partial class Register : System.Web.UI.Page
       {
          protected void CreateUser_Click(object sender, EventArgs e)
          {
             // Default UserStore constructor uses the default connection string named: DefaultConnection
             var userStore = new UserStore<IdentityUser>();
             var manager = new UserManager<IdentityUser>(userStore);
    
             var user = new IdentityUser() { UserName = UserName.Text };
             IdentityResult result = manager.Create(user, Password.Text);
    
             if (result.Succeeded)
             {
                StatusMessage.Text = string.Format("User {0} was created successfully!", user.UserName);
             }
             else
             {
                StatusMessage.Text = result.Errors.FirstOrDefault();
             }
          }
       }
    }
    

    Note

    1. Il codice precedente è una versione semplificata del file Register.aspx.cs creato quando si crea un nuovo progetto Web Form ASP.NET.
    2. La classe IdentityUser è l'implementazione predefinita di EntityFramework dell'interfaccia IUser . L'interfaccia IUser è l'interfaccia minima per un utente in ASP.NET Identity core.
    3. La classe userStore ambito è l'implementazione EntityFramework predefinita di un archivio utente. Questa classe implementa le interfacce minime del ASP.NET Identity core, ovvero IUserStore, IUserLoginStore, IUserClaimStore e IUserRoleStore.
    4. La classe usermanager espone le API correlate all'utente che salveranno automaticamente le modifiche apportate a userStore ambito.
    5. La classe IdentityResult rappresenta il risultato di un'operazione di identità.
  5. In Esplora soluzionifare clic con il pulsante destro del mouse sul progetto e scegliere Aggiungi, Aggiungi cartella ASP.NET e quindi dati_app.

  6. Aprire il file Web. config e aggiungere una voce della stringa di connessione per il database che si utilizzerà per archiviare le informazioni utente. Il database verrà creato in fase di esecuzione da EntityFramework per le entità Identity. La stringa di connessione è simile a una creata automaticamente quando si crea un nuovo progetto Web Form. Il codice evidenziato Mostra il markup che è necessario aggiungere:

    <?xml version="1.0" encoding="utf-8"?>
    <!--
      For more information on how to configure your ASP.NET application, please visit
      https://go.microsoft.com/fwlink/?LinkId=169433
      -->
    <configuration>
      <configSections>
        <!-- For more information on Entity Framework configuration, visit https://go.microsoft.com/fwlink/?LinkID=237468 -->
        <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
      </configSections>
       <connectionStrings>
          <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\WebFormsIdentity.mdf;Initial Catalog=WebFormsIdentity;Integrated Security=True"
                providerName="System.Data.SqlClient" />
       </connectionStrings>
      <system.web>
        <compilation debug="true" targetFramework="4.5" />
        <httpRuntime targetFramework="4.5" />
      </system.web>
      <entityFramework>
        <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
          <parameters>
            <parameter value="v11.0" />
          </parameters>
        </defaultConnectionFactory>
        <providers>
          <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
        </providers>
      </entityFramework>
    </configuration>
    

    Note

    Per Visual Studio 2015 o versione successiva, sostituire (localdb)\v11.0 con (localdb)\MSSQLLocalDB nella stringa di connessione.

  7. Fare clic con il pulsante destro del mouse su file Register. aspx nel progetto e selezionare Imposta come pagina iniziale. Premere CTRL + F5 per compilare ed eseguire l'applicazione Web. Immettere un nuovo nome utente e una nuova password, quindi selezionare registra.

    Note

    ASP.NET Identity dispone del supporto per la convalida e in questo esempio è possibile verificare il comportamento predefinito sui validator utente e password che provengono dal pacchetto Identity core. Il validator predefinito per User (UserValidator) dispone di una proprietà AllowOnlyAlphanumericUserNames il cui valore predefinito è impostato su true. Il validator predefinito per la password (MinimumLengthValidator) garantisce che la password contenga almeno 6 caratteri. Questi validator sono proprietà di UserManager di cui è possibile eseguire l'override se si desidera eseguire la convalida personalizzata,

Verificare il database di identità e le tabelle del database locale generati da Entity Framework

  1. Scegliere Esplora serverdal menu Visualizza .

  2. Espandere DefaultConnection (WebFormsIdentity) , espandere tabelle, fare clic con il pulsante destro del mouse su AspNetUsers , quindi scegliere Mostra dati tabella.


Configurare l'applicazione per l'autenticazione OWIN

A questo punto è stato aggiunto il supporto per la creazione di utenti. Ora verrà illustrato come è possibile aggiungere l'autenticazione per l'accesso a un utente. ASP.NET Identity usa il middleware di autenticazione di Microsoft OWIN per l'autenticazione basata su form. L'autenticazione del cookie OWIN è un meccanismo di autenticazione basato su cookie e attestazioni che può essere usato da qualsiasi framework ospitato in OWIN o IIS. Con questo modello, è possibile usare gli stessi pacchetti di autenticazione in più Framework, tra cui ASP.NET MVC e Web Form. Per altre informazioni sul progetto Katana e su come eseguire il middleware in un host agnostico, vedere Introduzione con il progetto Katana.

Installare i pacchetti di autenticazione nell'applicazione

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e scegliere Gestisci pacchetti NuGet. Cercare e installare il pacchetto Microsoft. AspNet. Identity. Owin .

  2. Cercare e installare il pacchetto Microsoft. Owin. host. systemWeb .

    Note

    Il pacchetto Microsoft. AspNet. Identity. Owin contiene un set di classi di estensione Owin per gestire e configurare il middleware di autenticazione Owin che deve essere utilizzato dai pacchetti ASP.NET Identity core. Il pacchetto Microsoft. Owin. host. systemWeb contiene un server Owin che consente l'esecuzione di applicazioni basate su OWIN in IIS tramite la pipeline delle richieste ASP.NET. Per altre informazioni, vedere il middleware OWIN nella pipeline integrata di IIS.

Aggiungere classi di configurazione di avvio e autenticazione OWIN

  1. In Esplora soluzionifare clic con il pulsante destro del mouse sul progetto, scegliere Aggiungi, quindi Aggiungi nuovo elemento. Nella finestra di dialogo Cerca casella di testo digitare "Owin". Assegnare alla classe il nome "Startup" e selezionare Aggiungi.

  2. Nel file Startup.cs aggiungere il codice evidenziato riportato di seguito per configurare l'autenticazione di OWIN cookie.

    using Microsoft.AspNet.Identity;
    using Microsoft.Owin;
    using Microsoft.Owin.Security.Cookies;
    using Owin;
    
    [assembly: OwinStartup(typeof(WebFormsIdentity.Startup))]
    
    namespace WebFormsIdentity
    {
       public class Startup
       {
          public void Configuration(IAppBuilder app)
          {
             // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=316888
             app.UseCookieAuthentication(new CookieAuthenticationOptions
             {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = new PathString("/Login")
             });
          }
       }
    }
    

    Note

    Questa classe contiene l'attributo OwinStartup per specificare la classe di avvio OWIN. Ogni applicazione OWIN dispone di una classe startup in cui è possibile specificare i componenti per la pipeline dell'applicazione. Per altre informazioni su questo modello, vedere rilevamento della classe di avvio OWIN .

Aggiungere Web Form per la registrazione e l'accesso degli utenti

  1. Aprire il file Register.aspx.cs e aggiungere il codice seguente che esegue l'accesso all'utente quando la registrazione ha esito positivo.

    using Microsoft.AspNet.Identity;
    using Microsoft.AspNet.Identity.EntityFramework;
    using Microsoft.Owin.Security;
    using System;
    using System.Linq;
    using System.Web;
    
    namespace WebFormsIdentity
    {
       public partial class Register : System.Web.UI.Page
       {
          protected void CreateUser_Click(object sender, EventArgs e)
          {
             // Default UserStore constructor uses the default connection string named: DefaultConnection
             var userStore = new UserStore<IdentityUser>();
             var manager = new UserManager<IdentityUser>(userStore);
             var user = new IdentityUser() { UserName = UserName.Text };
    
             IdentityResult result = manager.Create(user, Password.Text);
    
             if (result.Succeeded)
             {
                var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;
                var userIdentity = manager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie);
                authenticationManager.SignIn(new AuthenticationProperties() { }, userIdentity);
                Response.Redirect("~/Login.aspx");
             }
             else
             {
                StatusMessage.Text = result.Errors.FirstOrDefault();
             }
          }
       }
    }
    

    Note

    • Poiché l'autenticazione dei cookie ASP.NET Identity e OWIN è basata su attestazioni, il Framework richiede che lo sviluppatore di app generi un ClaimsIdentity per l'utente. ClaimsIdentity contiene informazioni su tutte le attestazioni per l'utente, ad esempio i ruoli a cui appartiene l'utente. In questa fase è anche possibile aggiungere altre attestazioni per l'utente.
    • È possibile accedere all'utente usando AuthenticationManager da OWIN e chiamando SignIn e passando il ClaimsIdentity come illustrato in precedenza. Questo codice effettuerà l'accesso dell'utente e genererà anche un cookie. Questa chiamata è analoga a FormAuthentication. SetAuthCookie usato dal modulo FormsAuthentication .
  2. In Esplora soluzionifare clic con il pulsante destro del mouse sul progetto, scegliere Aggiungi, quindi Web Form. Assegnare un nome all' account di accessoWeb Form.

  3. Sostituire il contenuto del file login. aspx con il codice seguente:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Login.aspx.cs" Inherits="WebFormsIdentity.Login" %>
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
       <title></title>
    </head>
    <body style="font-family: Arial, Helvetica, sans-serif; font-size: small">
       <form id="form1" runat="server">
          <div>
             <h4 style="font-size: medium">Log In</h4>
             <hr />
             <asp:PlaceHolder runat="server" ID="LoginStatus" Visible="false">
                <p>
                   <asp:Literal runat="server" ID="StatusText" />
                </p>
             </asp:PlaceHolder>
             <asp:PlaceHolder runat="server" ID="LoginForm" Visible="false">
                <div style="margin-bottom: 10px">
                   <asp:Label runat="server" AssociatedControlID="UserName">User name</asp:Label>
                   <div>
                      <asp:TextBox runat="server" ID="UserName" />
                   </div>
                </div>
                <div style="margin-bottom: 10px">
                   <asp:Label runat="server" AssociatedControlID="Password">Password</asp:Label>
                   <div>
                      <asp:TextBox runat="server" ID="Password" TextMode="Password" />
                   </div>
                </div>
                <div style="margin-bottom: 10px">
                   <div>
                      <asp:Button runat="server" OnClick="SignIn" Text="Log in" />
                   </div>
                </div>
             </asp:PlaceHolder>
             <asp:PlaceHolder runat="server" ID="LogoutButton" Visible="false">
                <div>
                   <div>
                      <asp:Button runat="server" OnClick="SignOut" Text="Log out" />
                   </div>
                </div>
             </asp:PlaceHolder>
          </div>
       </form>
    </body>
    </html>
    
  4. Sostituire il contenuto del file login.aspx.cs con il codice seguente:

    using Microsoft.AspNet.Identity;
    using Microsoft.AspNet.Identity.EntityFramework;
    using Microsoft.Owin.Security;
    using System;
    using System.Web;
    using System.Web.UI.WebControls;
    
    namespace WebFormsIdentity
    {
       public partial class Login : System.Web.UI.Page
       {
          protected void Page_Load(object sender, EventArgs e)
          {
             if (!IsPostBack)
             {
                if (User.Identity.IsAuthenticated)
                {
                   StatusText.Text = string.Format("Hello {0}!!", User.Identity.GetUserName());
                   LoginStatus.Visible = true;
                   LogoutButton.Visible = true;
                }
                else
                {
                   LoginForm.Visible = true;
                }
             }
          }
    
          protected void SignIn(object sender, EventArgs e)
          {
             var userStore = new UserStore<IdentityUser>();
             var userManager = new UserManager<IdentityUser>(userStore);
             var user = userManager.Find(UserName.Text, Password.Text);
    
             if (user != null)
             {
                var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;
                var userIdentity = userManager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie);
    
                authenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = false }, userIdentity);
                Response.Redirect("~/Login.aspx");
             }
             else
             {
                StatusText.Text = "Invalid username or password.";
                LoginStatus.Visible = true;
             }
          }
    
          protected void SignOut(object sender, EventArgs e)
          {
             var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;
             authenticationManager.SignOut();
             Response.Redirect("~/Login.aspx");
          }
       }
    }
    

    Note

    • Il Page_Load ora verifica lo stato dell'utente corrente ed esegue un'azione in base al relativo stato di Context.User.Identity.IsAuthenticated. Visualizzazione del nome utente connesso : il Framework di identità Microsoft ASP.NET ha aggiunto metodi di estensione su System. Security. Principal. IIdentity che consente di ottenere il UserName e UserId per l'utente connesso. Questi metodi di estensione sono definiti nell'assembly Microsoft.AspNet.Identity.Core. Questi metodi di estensione sono la sostituzione di HttpContext.User.Identity.Name .
    • Metodo SignIn: This metodo sostituisce il metodo CreateUser_Click precedente in questo esempio e ora accede all'utente dopo la creazione dell'utente.
      Microsoft OWIN Framework ha aggiunto metodi di estensione su System.Web.HttpContext che consente di ottenere un riferimento a un IOwinContext. Questi metodi di estensione sono definiti nell'assembly Microsoft.Owin.Host.SystemWeb. La classe OwinContext espone una proprietà IAuthenticationManager che rappresenta la funzionalità del middleware di autenticazione disponibile nella richiesta corrente. È possibile accedere all'utente usando il AuthenticationManager da OWIN e chiamando SignIn e passando il ClaimsIdentity come illustrato in precedenza. 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. Il ClaimsIdentity dispone di informazioni su tutte le attestazioni per l'utente, ad esempio i ruoli a cui appartiene l'utente. In questa fase è anche possibile aggiungere altre attestazioni per l'utente. questo codice effettuerà l'accesso dell'utente e genererà anche un cookie. Questa chiamata è analoga a FormAuthentication. SetAuthCookie usato dal modulo FormsAuthentication .
    • Metodo SignOut: ottiene un riferimento al AuthenticationManager da OWIN e chiama SignOut. Questo è analogo al metodo FormsAuthentication. Sign out usato dal modulo FormsAuthentication .
  5. Premere CTRL + F5 per compilare ed eseguire l'applicazione Web. Immettere un nuovo nome utente e una nuova password, quindi selezionare registra.


    Nota: a questo punto, il nuovo utente viene creato e connesso.

  6. Selezionare il pulsante Disconnetti . Si verrà reindirizzati al modulo di accesso.

  7. Immettere un nome utente o una password non valida e selezionare il pulsante Accedi . Il metodo UserManager.Find restituirà null e verrà visualizzato il messaggio di errore: " nome utente o password non valida ".