Hinzufügen von ASP.NET Identity zu einem leeren oder vorhandenen Web Forms-Projekt

In diesem Tutorial erfahren Sie, wie Sie einer ASP.NET Anwendung ASP.NET Identity (das neue Mitgliedschaftssystem für ASP.NET) hinzufügen.

Wenn Sie ein neues Web Forms- oder MVC-Projekt in Visual Studio 2017 RTM mit einzelnen Konten erstellen, installiert Visual Studio alle erforderlichen Pakete und fügt alle erforderlichen Klassen für Sie hinzu. In diesem Tutorial werden die Schritte zum Hinzufügen ASP.NET Identity-Unterstützung zu Ihrem vorhandenen Web Forms Projekt oder einem neuen leeren Projekt veranschaulicht. Ich beschreibt alle NuGet-Pakete, die Sie installieren müssen, und Klassen, die Sie hinzufügen müssen. Ich gehe auf Beispiel Web Forms für die Registrierung neuer Benutzer und die Anmeldung vor, während alle Standard Einstiegspunkt-APIs für die Benutzerverwaltung und -Authentifizierung hervorgehoben werden. In diesem Beispiel wird die Standardimplementierung ASP.NET Identity für den SQL-Datenspeicher verwendet, die auf Entity Framework basiert. In diesem Tutorial verwenden wir LocalDB für die SQL-Datenbank.

Erste Schritte mit ASP.NET Identity

  1. Beginnen Sie mit der Installation und Ausführung von Visual Studio 2017.

  2. Wählen Sie auf der Startseite neues Projekt aus, oder Sie können das Menü verwenden, und wählen Sie Datei und dann Neues Projekt aus.

  3. Erweitern Sie im linken Bereich Visual C#, wählen Sie dann Web und dann ASP.NET Webanwendung (.Net Framework) aus. Nennen Sie Ihr Projekt "WebFormsIdentity", und wählen Sie OK aus.

    Abbildung mit neuer Projekterstellung

  4. Wählen Sie im Dialogfeld Neues ASP.NET Projekt die Vorlage Leere aus.

    Neues Dialogfeld

    Beachten Sie, dass die Schaltfläche Authentifizierung ändern deaktiviert ist, und in dieser Vorlage wird keine Unterstützung für die Authentifizierung bereitgestellt. Mit den Vorlagen Web Forms, MVC und Web-API können Sie den Authentifizierungsansatz auswählen.

Hinzufügen von Identitätspaketen zu Ihrer App

Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf Ihr Projekt, und wählen Sie NuGet-Pakete verwalten aus. Suchen Sie nach dem Paket Microsoft.AspNet.Identity.EntityFramework , und installieren Sie es.

Abbildung, die den Zugriff auf die Verwaltung von Nu Get-Paketen veranschaulicht

Beachten Sie, dass dieses Paket die Abhängigkeitspakete EntityFramework und Microsoft ASP.NET Identity Core installiert.

Hinzufügen eines Webformulars zum Registrieren von Benutzern

  1. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf Ihr Projekt, und wählen Sie Hinzufügen und dann Webformular aus.

    Abbildung: Hinzufügen eines Webformulars zu registrierten Benutzern

  2. Geben Sie im Dialogfeld Name für Element angeben den Namen für das neue Webformular Register ein, und wählen Sie dann OK aus.

  3. Ersetzen Sie das Markup in der generierten Datei Register.aspx durch den folgenden Code. Die Codeänderungen werden hervorgehoben.

    <%@ 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>
    

    Hinweis

    Dies ist nur eine vereinfachte Version der Datei Register.aspx, die beim Erstellen eines neuen ASP.NET Web Forms-Projekts erstellt wird. Im obigen Markup werden Formularfelder und eine Schaltfläche hinzugefügt, um einen neuen Benutzer zu registrieren.

  4. Öffnen Sie die Datei Register.aspx.cs , und ersetzen Sie den Inhalt der Datei durch den folgenden Code:

    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();
             }
          }
       }
    }
    

    Hinweis

    1. Der obige Code ist eine vereinfachte Version der Datei Register.aspx.cs, die beim Erstellen eines neuen ASP.NET Web Forms-Projekts erstellt wird.
    2. Die IdentityUser-Klasse ist die EntityFramework-Standardimplementierung der IUser-Schnittstelle . Die IUser-Schnittstelle ist die minimale Schnittstelle für einen Benutzer auf ASP.NET Identity Core.
    3. Die UserStore-Klasse ist die EntityFramework-Standardimplementierung eines Benutzerspeichers. Diese Klasse implementiert die minimalen Schnittstellen von ASP.NET Identity Core: IUserStore, IUserLoginStore, IUserClaimStore und IUserRoleStore.
    4. Die UserManager-Klasse macht benutzerbezogene APIs verfügbar, die Änderungen automatisch im UserStore speichern.
    5. Die IdentityResult-Klasse stellt das Ergebnis eines Identitätsvorgangs dar.
  5. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf Ihr Projekt, und wählen Sie Hinzufügen, ASP.NET Ordner hinzufügen und dann App_Data aus.

    Abbildung des Hinzufügens von App-Daten

  6. Öffnen Sie die Web.config datei, und fügen Sie einen Verbindungszeichenfolgeneintrag für die Datenbank hinzu, die wir zum Speichern von Benutzerinformationen verwenden. Die Datenbank wird zur Laufzeit von EntityFramework für die Identitätsentitäten erstellt. Die Verbindungszeichenfolge ähnelt der für Sie erstellten Verbindungszeichenfolge, wenn Sie ein neues Web Forms-Projekt erstellen. Der hervorgehobene Code zeigt das Markup, das Sie hinzufügen sollten:

    <?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>
    

    Hinweis

    Ersetzen Sie (localdb)\v11.0 für Visual Studio 2015 oder höher in Ihrer Verbindungszeichenfolge durch (localdb)\MSSQLLocalDB .

  7. Klicken Sie in Ihrem Projekt mit der rechten Maustaste auf die Datei Register.aspx , und wählen Sie Als Startseite festlegen aus. Drücken Sie STRG+F5, um die Anwendung zu kompilieren und auszuführen. Geben Sie einen neuen Benutzernamen und ein neues Kennwort ein, und wählen Sie dann Registrieren aus.

    Image erfolgreich neue Benutzerregistrierung

    Hinweis

    ASP.NET Identity unterstützt die Überprüfung. In diesem Beispiel können Sie das Standardverhalten für Benutzer- und Kennwortvalidatoren überprüfen, die aus dem Identity Core-Paket stammen. Der Standardüberprüfungsator für Benutzer (UserValidator) verfügt über eine Eigenschaft AllowOnlyAlphanumericUserNames , die den Standardwert auf truefestgelegt hat. Die Standardüberprüfung für Kennwort (MinimumLengthValidator) stellt sicher, dass das Kennwort mindestens 6 Zeichen hat. Diese Validierungsatoren sind Eigenschaften für UserManager , die überschrieben werden können, wenn Sie eine benutzerdefinierte Überprüfung durchführen möchten.

Überprüfen der LocalDb Identity-Datenbank und der von Entity Framework generierten Tabellen

  1. Wählen Sie im Menü Ansichtdie Option Server Explorer aus.

    Abbildung des Zugriffs auf den Server-Explorer

  2. Erweitern Sie DefaultConnection (WebFormsIdentity), erweitern Sie Tabellen, klicken Sie mit der rechten Maustaste auf AspNetUsers , und wählen Sie dann Tabellendaten anzeigen aus.

    Abbildung des Zugriffs auf Tabellendaten
    Abbildung mit Tabellendaten registrierter Benutzer

Konfigurieren der Anwendung für die OWIN-Authentifizierung

An diesem Punkt haben wir nur Unterstützung für das Erstellen von Benutzern hinzugefügt. Nun wird gezeigt, wie wir die Authentifizierung hinzufügen können, um einen Benutzer anzumelden. ASP.NET Identity verwendet Microsoft OWIN Authentication Middleware für die Formularauthentifizierung. Die OWIN-Cookieauthentifizierung ist ein cookie- und anspruchsbasierter Authentifizierungsmechanismus, der von jedem Framework verwendet werden kann, das auf OWIN oder IIS gehostet wird. Mit diesem Modell können dieselben Authentifizierungspakete für mehrere Frameworks verwendet werden, einschließlich ASP.NET MVC und Web Forms. Weitere Informationen zum Projekt Katana und zum Ausführen von Middleware in einem unabhängigen Host finden Sie unter Erste Schritte mit dem Katana-Projekt.

Installieren von Authentifizierungspaketen für Ihre Anwendung

  1. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf Ihr Projekt, und wählen Sie NuGet-Pakete verwalten aus. Suchen Sie nach dem Paket Microsoft.AspNet.Identity.Owin , und installieren Sie es.

    Abbildung des Nu Get-Paket-Managers

  2. Suchen Sie nach dem Microsoft.Owin.Host.SystemWeb-Paket , und installieren Sie es.

    Hinweis

    Das Microsoft.Aspnet.Identity.Owin-Paket enthält eine Reihe von OWIN-Erweiterungsklassen zum Verwalten und Konfigurieren der Middleware für die OWIN-Authentifizierung, die von ASP.NET Identity Core-Paketen verwendet wird. Das Paket Microsoft.Owin.Host.SystemWeb enthält einen OWIN-Server, mit dem OWIN-basierte Anwendungen mithilfe der ASP.NET Anforderungspipeline auf IIS ausgeführt werden können. Weitere Informationen finden Sie unter OWIN Middleware in der integrierten IIS-Pipeline.

Hinzufügen von OWIN-Start- und Authentifizierungskonfigurationsklassen

  1. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf Ihr Projekt, wählen Sie Hinzufügen und dann Neues Element hinzufügen aus. Geben Sie im Dialogfeld Suchtext "owin" ein. Nennen Sie die Klasse "Startup", und wählen Sie Hinzufügen aus.

    Abbildung des Fensters

  2. Fügen Sie in der Datei Startup.cs den unten gezeigten hervorgehobenen Code hinzu, um die OWIN-Cookieauthentifizierung zu konfigurieren.

    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")
             });
          }
       }
    }
    

    Hinweis

    Diese Klasse enthält das OwinStartup Attribut zum Angeben der OWIN-Startklasse. Jede OWIN-Anwendung verfügt über eine Startklasse, in der Sie Komponenten für die Anwendungspipeline angeben. Weitere Informationen zu diesem Modell finden Sie unter OWIN-Startklassenerkennung .

Hinzufügen von Webformularen zum Registrieren und Anmelden von Benutzern

  1. Öffnen Sie die Datei Register.aspx.cs , und fügen Sie den folgenden Code hinzu, der den Benutzer anmeldet, wenn die Registrierung erfolgreich ist.

    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();
             }
          }
       }
    }
    

    Hinweis

    • Da ASP.NET Identity und OWIN Cookie Authentication anspruchsbasiertes System sind, erfordert das Framework, dass der App-Entwickler eine ClaimsIdentity für den Benutzer generiert. ClaimsIdentity enthält Informationen zu allen Ansprüchen für den Benutzer, z. B. zu den Rollen, zu der der Benutzer gehört. Sie können in dieser Phase auch weitere Ansprüche für den Benutzer hinzufügen.
    • Sie können den Benutzer anmelden, indem Sie den AuthenticationManager von OWIN verwenden und ClaimsIdentity aufrufen SignIn und übergeben, wie oben gezeigt. Mit diesem Code wird der Benutzer angemeldet und auch ein Cookie generiert. Dieser Aufruf ist analog zu FormAuthentication.SetAuthCookie , die vom FormsAuthentication-Modul verwendet wird.
  2. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf Ihr Projekt, wählen Sie Hinzufügen und dann Webformular aus. Nennen Sie das Webformular Login.

    Bild, das ein neues Webformular hinzufügt

  3. Ersetzen Sie den Inhalt der Datei Login.aspx durch den folgenden Code:

    <%@ 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. Ersetzen Sie den Inhalt der Datei Login.aspx.cs durch Folgendes:

    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");
          }
       }
    }
    

    Hinweis

    • Der Page_Load überprüft nun nach der status des aktuellen Benutzers und ergreift aktionen basierend auf seiner Context.User.Identity.IsAuthenticated status. Angemeldeter Benutzername anzeigen : Das Microsoft ASP.NET Identity Framework hat Erweiterungsmethoden für System.Security.Principal.IIdentity hinzugefügt, mit denen Sie und UserNameUserId für den angemeldeten Benutzer abrufen können. Diese Erweiterungsmethoden werden in der Microsoft.AspNet.Identity.Core Assembly definiert. Diese Erweiterungsmethoden ersetzen HttpContext.User.Identity.Name .
    • SignIn-Methode: This Die Methode ersetzt die vorherige CreateUser_Click Methode in diesem Beispiel und meldet sich nun beim Benutzer an, nachdem der Benutzer erfolgreich erstellt wurde.
      Das Microsoft OWIN-Framework hat Erweiterungsmethoden System.Web.HttpContext für hinzugefügt, mit denen Sie einen Verweis auf einen IOwinContextabrufen können. Diese Erweiterungsmethoden werden in der Microsoft.Owin.Host.SystemWeb Assembly definiert. Die OwinContext -Klasse macht eine IAuthenticationManager Eigenschaft verfügbar, die die Für die aktuelle Anforderung verfügbare Authentifizierungsmiddleware-Funktionalität darstellt. Sie können den Benutzer anmelden, indem Sie den AuthenticationManager von OWIN verwenden und wie oben gezeigt aufrufen ClaimsIdentitySignIn und übergeben. Da ASP.NET Identity und OWIN Cookie Authentication anspruchsbasierte Systeme sind, erfordert das Framework, dass die App ein ClaimsIdentity für den Benutzer generiert. Enthält ClaimsIdentity Informationen zu allen Ansprüchen für den Benutzer, z. B. zu den Rollen, zu der der Benutzer gehört. Sie können in dieser Phase auch weitere Ansprüche für den Benutzer hinzufügen. Dieser Code wird den Benutzer anmelden und auch ein Cookie generieren. Dieser Aufruf ist analog zu FormAuthentication.SetAuthCookie , die vom FormsAuthentication-Modul verwendet wird.
    • SignOut -Methode: Ruft einen Verweis auf den AuthenticationManager von OWIN ab und ruft auf SignOut. Dies entspricht der FormsAuthentication.SignOut-Methode , die vom FormsAuthentication-Modul verwendet wird.
  5. Drücken Sie STRG+F5 , um die Webanwendung zu erstellen und auszuführen. Geben Sie einen neuen Benutzernamen und ein neues Kennwort ein, und wählen Sie dann Registrieren aus.

    Abbildung der Registrierung für neue Usr
    Hinweis: An diesem Punkt wird der neue Benutzer erstellt und angemeldet.

  6. Wählen Sie die Schaltfläche Abmelden aus . Sie werden zum Formular Anmelden umgeleitet.

  7. Geben Sie einen ungültigen Benutzernamen oder ein ungültiges Kennwort ein, und wählen Sie die Schaltfläche Anmelden aus. Die UserManager.Find Methode gibt NULL zurück, und die Fehlermeldung " Ungültiger Benutzername oder Kennwort " wird angezeigt.

    Abbildung eines ungültigen Anmeldeversuchs