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
Beginnen Sie mit der Installation und Ausführung von Visual Studio 2017.
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.
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.
Wählen Sie im Dialogfeld Neues ASP.NET Projekt die Vorlage Leere aus.
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.
Beachten Sie, dass dieses Paket die Abhängigkeitspakete EntityFramework und Microsoft ASP.NET Identity Core installiert.
Hinzufügen eines Webformulars zum Registrieren von Benutzern
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf Ihr Projekt, und wählen Sie Hinzufügen und dann Webformular aus.
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.
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.
Ö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
- Der obige Code ist eine vereinfachte Version der Datei Register.aspx.cs, die beim Erstellen eines neuen ASP.NET Web Forms-Projekts erstellt wird.
- 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.
- 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.
- Die UserManager-Klasse macht benutzerbezogene APIs verfügbar, die Änderungen automatisch im UserStore speichern.
- Die IdentityResult-Klasse stellt das Ergebnis eines Identitätsvorgangs dar.
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.
Ö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
.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.
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 EigenschaftAllowOnlyAlphanumericUserNames
, die den Standardwert auftrue
festgelegt hat. Die Standardüberprüfung für Kennwort (MinimumLengthValidator
) stellt sicher, dass das Kennwort mindestens 6 Zeichen hat. Diese Validierungsatoren sind Eigenschaften fürUserManager
, 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
Wählen Sie im Menü Ansichtdie Option Server Explorer aus.
Erweitern Sie DefaultConnection (WebFormsIdentity), erweitern Sie Tabellen, klicken Sie mit der rechten Maustaste auf AspNetUsers , und wählen Sie dann Tabellendaten anzeigen aus.
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
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.
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
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.
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
Ö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.
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.
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>
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 seinerContext.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 undUserName
UserId
für den angemeldeten Benutzer abrufen können. Diese Erweiterungsmethoden werden in derMicrosoft.AspNet.Identity.Core
Assembly definiert. Diese Erweiterungsmethoden ersetzen HttpContext.User.Identity.Name . - SignIn-Methode:
This
Die Methode ersetzt die vorherigeCreateUser_Click
Methode in diesem Beispiel und meldet sich nun beim Benutzer an, nachdem der Benutzer erfolgreich erstellt wurde.
Das Microsoft OWIN-Framework hat ErweiterungsmethodenSystem.Web.HttpContext
für hinzugefügt, mit denen Sie einen Verweis auf einenIOwinContext
abrufen können. Diese Erweiterungsmethoden werden in derMicrosoft.Owin.Host.SystemWeb
Assembly definiert. DieOwinContext
-Klasse macht eineIAuthenticationManager
Eigenschaft verfügbar, die die Für die aktuelle Anforderung verfügbare Authentifizierungsmiddleware-Funktionalität darstellt. Sie können den Benutzer anmelden, indem Sie denAuthenticationManager
von OWIN verwenden und wie oben gezeigt aufrufenClaimsIdentity
SignIn
und übergeben. Da ASP.NET Identity und OWIN Cookie Authentication anspruchsbasierte Systeme sind, erfordert das Framework, dass die App einClaimsIdentity
für den Benutzer generiert. EnthältClaimsIdentity
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 denAuthenticationManager
von OWIN ab und ruft aufSignOut
. Dies entspricht der FormsAuthentication.SignOut-Methode , die vom FormsAuthentication-Modul verwendet wird.
- Der
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.
Hinweis: An diesem Punkt wird der neue Benutzer erstellt und angemeldet.Wählen Sie die Schaltfläche Abmelden aus . Sie werden zum Formular Anmelden umgeleitet.
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.