Hinzufügen von Benutzerkonten (VB)
von Scott Mitchell
Hinweis
Seit diesem Artikel wurden die ASP.NET-Mitgliedschaftsanbieter von ASP.NET Identity abgelöst. Es wird dringend empfohlen, Apps so zu aktualisieren, dass sie die ASP.NET Identity-Plattform anstelle der Mitgliedschaftsanbieter verwenden, die zum Zeitpunkt des Schreibens dieses Artikels vorgestellt wurden. ASP.NET Identity bietet eine Reihe von Vorteilen gegenüber dem ASP.NET Mitgliedschaftssystem, darunter:
- Bessere Leistung
- Verbesserte Erweiterbarkeit und Testbarkeit
- Unterstützung für OAuth, OpenID Connect und zweistufige Authentifizierung
- Unterstützung der anspruchsbasierten Identität
- Bessere Interoperabilität mit ASP.Net Core
Code herunterladen oder PDF herunterladen
In diesem Tutorial untersuchen wir die Verwendung des Membership-Frameworks (über sqlMembershipProvider), um neue Benutzerkonten zu erstellen. Wir werden sehen, wie sie neue Benutzer programmgesteuert und über ASP erstellen. Net's integriertes CreateUserWizard-Steuerelement.
Einführung
Im vorherigen Tutorial haben wir das Anwendungsdienstschema in einer Datenbank installiert, wodurch die von und benötigten Tabellen, Sichten und gespeicherten Prozeduren hinzugefügt wurden SqlMembershipProvider
SqlRoleProvider
. Dadurch wurde die Infrastruktur geschaffen, die wir für den Rest der Tutorials in dieser Reihe benötigen. In diesem Tutorial untersuchen wir die Verwendung des Mitgliedschaftsframeworks (über das SqlMembershipProvider
), um neue Benutzerkonten zu erstellen. Wir werden sehen, wie sie neue Benutzer programmgesteuert und über ASP erstellen. Net's integriertes CreateUserWizard-Steuerelement.
Zusätzlich zum Erstellen neuer Benutzerkonten müssen wir auch die Demowebsite aktualisieren, die wir zuerst im Tutorial Eine Übersicht über die Formularauthentifizierung erstellt haben. Unsere Demo-Webanwendung verfügt über eine Anmeldeseite, die die Anmeldeinformationen der Benutzer anhand hartcodierter Benutzernamen/Kennwort-Paare überprüft. Darüber hinaus enthält Code, Global.asax
der benutzerdefinierte IPrincipal
und IIdentity
Objekte für authentifizierte Benutzer erstellt. Wir aktualisieren die Anmeldeseite, um die Anmeldeinformationen der Benutzer anhand des Mitgliedschaftsframeworks zu überprüfen und den benutzerdefinierten Prinzipal und die Identitätslogik zu entfernen.
Jetzt geht‘s los!
Checkliste für Formularauthentifizierung und Mitgliedschaft
Bevor wir mit der Arbeit mit dem Mitgliedschaftsframework beginnen, nehmen wir uns einen Moment Zeit, um die wichtigen Schritte zu überprüfen, die wir unternommen haben, um diesen Punkt zu erreichen. Wenn Sie das Mitgliedschaftsframework mit dem SqlMembershipProvider
in einem formularbasierten Authentifizierungsszenario verwenden, müssen die folgenden Schritte ausgeführt werden, bevor Sie die Mitgliedschaftsfunktionalität in Ihrer Webanwendung implementieren:
- Aktivieren Sie die formularbasierte Authentifizierung. Wie unter Eine Übersicht über die Formularauthentifizierung beschrieben, wird die Formularauthentifizierung durch Bearbeiten
Web.config
und Festlegen des Attributs des<authentication>
mode
Elements aufForms
aktiviert. Wenn die Formularauthentifizierung aktiviert ist, wird jede eingehende Anforderung auf ein Formularauthentifizierungsticket untersucht, das, falls vorhanden, den Anforderer identifiziert. - Fügen Sie das Anwendungsdienstschema der entsprechenden Datenbank hinzu. Wenn Sie die
SqlMembershipProvider
verwenden, müssen Sie das Anwendungsdienstschema in einer Datenbank installieren. Normalerweise wird dieses Schema der gleichen Datenbank hinzugefügt, die das Datenmodell der Anwendung enthält. Im Tutorial Erstellen des Mitgliedschaftsschemas in SQL Server wurde die Verwendung des Tools untersucht, um diesaspnet_regsql.exe
zu erreichen. - Passen Sie die Einstellungen der Webanwendung an, um auf die Datenbank aus Schritt 2 zu verweisen. Im Tutorial Erstellen des Mitgliedschaftsschemas in SQL Server wurden zwei Möglichkeiten gezeigt, die Webanwendung so zu konfigurieren, dass die
SqlMembershipProvider
in Schritt 2 ausgewählte Datenbank verwendet: durch Ändern desLocalSqlServer
Verbindungszeichenfolgennamens oder durch Hinzufügen eines neuen registrierten Anbieters zur Liste der Mitgliedschaftsframeworkanbieter und Anpassen des neuen Anbieters für die Verwendung der Datenbank aus Schritt 2.
Beim Erstellen einer Webanwendung, die die SqlMembershipProvider
formularbasierte Authentifizierung und verwendet, müssen Sie diese drei Schritte ausführen, bevor Sie die Membership
Klasse oder das ASP.NET Login-Websteuerelemente verwenden. Da wir diese Schritte bereits in früheren Tutorials ausgeführt haben, können wir mit der Verwendung des Mitgliedschaftsframeworks beginnen!
Schritt 1: Hinzufügen neuer ASP.NET Seiten
In diesem Tutorial und den nächsten drei werden wir verschiedene Funktionen und Funktionen im Zusammenhang mit der Mitgliedschaft untersuchen. Wir benötigen eine Reihe von ASP.NET Seiten, um die in diesen Tutorials behandelten Themen zu implementieren. Erstellen Wir diese Seiten und dann eine Siteübersichtsdatei (Web.sitemap)
.
Erstellen Sie zunächst einen neuen Ordner im Projekt mit dem Namen Membership
. Fügen Sie dem Ordner als Nächstes fünf neue ASP.NET-Seiten hinzu, wobei Membership
jede Seite mit der Site.master
master-Seite verknüpft wird. Nennen Sie die Seiten:
CreatingUserAccounts.aspx
UserBasedAuthorization.aspx
EnhancedCreateUserWizard.aspx
AdditionalUserInfo.aspx
Guestbook.aspx
An diesem Punkt sollte die Projektmappen-Explorer Ihres Projekts dem Screenshot in Abbildung 1 ähneln.
Abbildung 1: Fünf neue Seiten wurden zum Ordner hinzugefügt (Klicken Sie hier, um dasMembership
Bild in voller Größe anzuzeigen)
Jede Seite sollte zu diesem Zeitpunkt über die beiden Content-Steuerelemente verfügen, eines für jedes der ContentPlaceHolders der master Seite: MainContent
und LoginContent
.
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent"
Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="LoginContent"
Runat="Server">
</asp:Content>
Denken Sie daran, dass das LoginContent
Standardmarkup von ContentPlaceHolder einen Link zum Anmelden oder Abmelden der Website anzeigt, je nachdem, ob der Benutzer authentifiziert ist. Das Vorhandensein des Content2
Inhaltssteuerelements überschreibt jedoch das Standardmarkup der master Seite. Wie im Tutorial Eine Übersicht über die Formularauthentifizierung erläutert, ist dies auf Seiten nützlich, auf denen anmeldebezogene Optionen in der linken Spalte nicht angezeigt werden sollen.
Für diese fünf Seiten möchten wir jedoch das Standardmarkup der master Seite für den LoginContent
ContentPlaceHolder anzeigen. Entfernen Sie daher das deklarative Markup für das Content2
Content-Steuerelement. Danach sollte jede der fünf Seiten nur ein Content-Steuerelement enthalten.
Schritt 2: Erstellen der Standortübersicht
Alle bis auf die trivialsten Websites müssen eine Form einer Navigations-Benutzeroberfläche implementieren. Die Navigations-Benutzeroberfläche kann eine einfache Liste von Links zu den verschiedenen Abschnitten der Website sein. Alternativ können diese Links in Menüs oder Strukturansichten angeordnet werden. Als Seitenentwickler ist das Erstellen der Navigations-Benutzeroberfläche nur die Hälfte der Geschichte. Wir benötigen auch einige Mittel, um die logische Struktur der Website in einer verwaltbaren und aktualisierbaren Weise zu definieren. Wenn neue Seiten hinzugefügt oder vorhandene Seiten entfernt werden, möchten wir in der Lage sein, eine einzelne Quelle – die Websiteübersicht – zu aktualisieren und diese Änderungen auf der Navigationsoberfläche der Website widerzuspiegeln.
Diese beiden Aufgaben – das Definieren der Websiteübersicht und die Implementierung einer Navigationsbenutzeroberfläche basierend auf der Websiteübersicht – sind dank des Site Map-Frameworks und der Navigationswebsteuerelemente, die in ASP.NET Version 2.0 hinzugefügt wurden, einfach zu erledigen. Das Site Map-Framework ermöglicht es einem Entwickler, eine Siteübersicht zu definieren und dann über eine programmgesteuerte API (die SiteMap
-Klasse) darauf zuzugreifen. Die integrierten Navigationswebsteuerelemente umfassen ein Menüsteuerelement, das TreeView-Steuerelement und das SiteMapPath-Steuerelement.
Wie das Mitgliedschafts- und Rollenframework wird auch das Site Map-Framework auf dem Anbietermodell erstellt. Die Aufgabe der Site Map-Anbieterklasse besteht darin, die von der SiteMap
-Klasse verwendete In-Memory-Struktur aus einem persistenten Datenspeicher, z. B. einer XML-Datei oder einer Datenbanktabelle, zu generieren. Die .NET Framework wird mit einem Standardanbieter für site map geliefert, der die Siteübersichtsdaten aus einer XML-Datei liest (XmlSiteMapProvider
), und dies ist der Anbieter, den wir in diesem Tutorial verwenden werden. Einige alternative Implementierungen des Site Map-Anbieters finden Sie im Abschnitt Weitere Informationen am Ende dieses Tutorials.
Der Standardanbieter für site map erwartet, dass eine ordnungsgemäß formatierte XML-Datei mit dem Namen Web.sitemap
des Stammverzeichnisses vorhanden ist. Da wir diesen Standardanbieter verwenden, müssen wir eine solche Datei hinzufügen und die Struktur der Websiteübersicht im entsprechenden XML-Format definieren. Um die Datei hinzuzufügen, klicken Sie mit der rechten Maustaste auf den Projektnamen in Projektmappen-Explorer, und wählen Sie Neues Element hinzufügen aus. Wählen Sie im Dialogfeld aus, um eine Datei vom Typ Site Map mit dem Namen Web.sitemap
hinzuzufügen.
Abbildung 2: Hinzufügen einer Datei namens Web.sitemap
zum Stammverzeichnis des Projekts (Klicken Sie hier, um das bild in voller Größe anzuzeigen)
Die XML-Siteübersichtsdatei definiert die Struktur der Website als Hierarchie. Diese hierarchische Beziehung wird in der XML-Datei über die Herkunft der <siteMapNode>
Elemente modelliert. Der Web.sitemap
muss mit einem <siteMap>
übergeordneten Knoten beginnen, der genau über ein untergeordnetes <siteMapNode>
Element verfügt. Dieses Element der obersten Ebene <siteMapNode>
stellt den Stamm der Hierarchie dar und kann eine beliebige Anzahl absteigender Knoten aufweisen. Jedes <siteMapNode>
Element muss ein title
Attribut enthalten und kann optional attribute enthalten url
description
. Jedes nicht leere url
Attribut muss eindeutig sein.
Geben Sie den folgenden XML-Code in die Web.sitemap
Datei ein:
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0">
<siteMapNode url="~/Default.aspx" title="Home">
<siteMapNode title="Membership">
<siteMapNode url="~/Membership/CreatingUserAccounts.aspx" title="Creating User Accounts" />
<siteMapNode url="~/Membership/UserBasedAuthorization.aspx" title="User-Based Authorization" />
<siteMapNode url="~/Membership/Guestbook.aspx" title="Storing Additional User Information" />
</siteMapNode>
</siteMapNode>
</siteMap>
Das obige Websitezuordnungsmarkup definiert die in Abbildung 3 dargestellte Hierarchie.
Abbildung 3: Die Websiteübersicht stellt eine hierarchische Navigationsstruktur dar (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Schritt 3: Aktualisieren der Gestaltungsvorlage auf Die Einbeziehung einer Navigations-Benutzeroberfläche
ASP.NET enthält eine Reihe navigationsbezogener Websteuerelemente zum Entwerfen einer Benutzeroberfläche. Dazu gehören die Steuerelemente Menu, TreeView und SiteMapPath. Die Menü- und TreeView-Steuerelemente rendern die Struktur der Siteübersicht in einem Menü bzw. einer Struktur, während siteMapPath eine Breadcrumb anzeigt, die den aktuellen besuchten Knoten und seine Vorgänger anzeigt. Die Siteübersichtsdaten können mithilfe der SiteMapDataSource an andere Datenwebsteuerelemente gebunden werden und über die -Klasse programmgesteuert auf sie SiteMap
zugegriffen werden.
Da eine ausführliche Diskussion über das Site Map Framework und die Navigationssteuerelemente außerhalb des Rahmens dieser Tutorialreihe liegt, anstatt Zeit mit dem Erstellen einer eigenen Navigations-Benutzeroberfläche zu verbringen, sollten wir uns stattdessen die in meiner Tutorialreihe Arbeiten mit Daten in ASP.NET 2.0-Tutorialreihe verwenden, die ein Repeater-Steuerelement verwendet, um eine Liste mit zwei tiefen Aufzählungen von Navigationslinks anzuzeigen, wie in Abbildung 4 dargestellt.
Hinzufügen einer Two-Level Liste von Links in der linken Spalte
Um diese Schnittstelle zu erstellen, fügen Sie der linken Spalte der master Seite das Site.master
folgende deklarative Markup hinzu, in der der Text TODO: Menu hier angezeigt wird... befindet sich derzeit.
<ul>
<li>
<asp:HyperLink runat="server" ID="lnkHome" NavigateUrl="~/Default.aspx">Home</asp:HyperLink>
</li>
<asp:Repeater runat="server" ID="menu" DataSourceID="SiteMapDataSource1">
<ItemTemplate>
<li>
<asp:HyperLink ID="lnkMenuItem" runat="server"
NavigateUrl='<%# Eval("Url") %>'><%# Eval("Title") %></asp:HyperLink>
<asp:Repeater ID="submenu" runat="server" DataSource="<%#
CType(Container.DataItem, SiteMapNode).ChildNodes %>">
<HeaderTemplate>
<ul>
</HeaderTemplate>
<ItemTemplate>
<li>
<asp:HyperLink ID="lnkMenuItem"
runat="server" NavigateUrl='<%# Eval("Url") %>'><%# Eval("Title") %></asp:HyperLink>
</li>
</ItemTemplate>
<FooterTemplate>
</ul>
</FooterTemplate>
</asp:Repeater>
</li>
</ItemTemplate>
</asp:Repeater>
</ul>
<asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" ShowStartingNode="false"/>
Das obige Markup bindet ein Repeater-Steuerelement mit dem Namen menu
an eine SiteMapDataSource, das die in Web.sitemap
definierte Site Map-Hierarchie zurückgibt. Da die Eigenschaft des SiteMapDataSource-Steuerelements ShowStartingNode
auf False festgelegt ist, beginnt es, die Hierarchie der Siteübersicht ab den Absteigenden des Knotens Home zurückzugeben. Der Repeater zeigt jeden dieser Knoten (derzeit nur Mitgliedschaft) in einem Element an <li>
. Ein weiterer, innerer Repeater zeigt dann die untergeordneten Elemente des aktuellen Knotens in einer geschachtelten, nicht sortierten Liste an.
Abbildung 4 zeigt die gerenderte Ausgabe des obigen Markups mit der site map-Struktur, die wir in Schritt 2 erstellt haben. Der Repeater rendert vanilla ungeordnetes Listenmarkup; Die in Styles.css
definierten Cascading Stylesheet-Regeln sind für das ästhetisch ansprechende Layout verantwortlich. Eine ausführlichere Beschreibung der Funktionsweise des obigen Markups finden Sie im Tutorial gestaltungsvorlagen und Websitenavigation .
Abbildung 4: Die Navigationsbenutzeroberfläche wird mithilfe geschachtelter ungeordneter Listen gerendert (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Hinzufügen der Breadcrumb-Navigation
Zusätzlich zur Liste der Links in der linken Spalte wird für jede Seite auch ein Breadcrumb angezeigt. Ein Breadcrumb ist ein navigationsaktives Benutzeroberflächenelement, das Benutzern schnell ihre aktuelle Position innerhalb der Websitehierarchie anzeigt. Das SiteMapPath-Steuerelement verwendet das Site Map-Framework, um den Standort der aktuellen Seite in der Websiteübersicht zu bestimmen und zeigt dann basierend auf diesen Informationen ein Breadcrumb an.
Fügen Sie insbesondere dem Headerelement <div>
der master Seite ein <span>
Element hinzu, und legen Sie das Attribut des class
neuen <span>
Elements auf breadcrumb fest. (Die Styles.css
-Klasse enthält eine Regel für eine Breadcrumb-Klasse.) Fügen Sie als Nächstes diesem neuen <span>
Element einen SiteMapPath hinzu.
<div id="header">
<span class="title">User Account Tutorials</span><br />
<span class="breadcrumb">
<asp:SiteMapPath ID="SiteMapPath1" runat="server">
</asp:SiteMapPath>
</span>
</div>
Abbildung 5 zeigt die Ausgabe von SiteMapPath beim Besuch von ~/Membership/CreatingUserAccounts.aspx
.
Abbildung 5: Breadcrumb zeigt die aktuelle Seite und die zugehörigen Vorgänger in der Websiteübersicht an (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Schritt 4: Entfernen der benutzerdefinierten Prinzipal- und Identitätslogik
Benutzerdefinierte Prinzipal- und Identitätsobjekte können dem authentifizierten Benutzer zugeordnet werden. Dies wurde erreicht, indem wir einen Ereignishandler in Global.asax
für das Ereignis der Anwendung PostAuthenticateRequest
erstellt haben, das ausgelöst wird, nachdem der FormsAuthenticationModule
Benutzer authentifiziert wurde. In diesem Ereignishandler haben wir die von hinzugefügten GenericPrincipal
-Objekte und FormsIdentity
durch die -FormsAuthenticationModule
Objekte und CustomIdentity
ersetzt, die CustomPrincipal
wir in diesem Tutorial erstellt haben.
Benutzerdefinierte Prinzipal- und Identitätsobjekte sind in bestimmten Szenarien zwar nützlich, aber in den meisten Fällen sind die GenericPrincipal
Objekte und FormsIdentity
ausreichend. Daher denke ich, dass es sich lohnen würde, zum Standardverhalten zurückzukehren. Nehmen Sie diese Änderung vor, indem Sie entweder den PostAuthenticateRequest
Ereignishandler entfernen oder auskommentieren oder die Global.asax
Datei vollständig löschen.
Hinweis
Nachdem Sie den Code in Global.asax
kommentiert oder entfernt haben, müssen Sie den Code in Default.aspx's
der CodeBehind-Klasse auskommentieren, mit der die User.Identity
Eigenschaft in eine CustomIdentity
instance umgewandelt wird.
Schritt 5: Programmgesteuertes Erstellen eines neuen Benutzers
Verwenden Sie die -Methode der -KlasseCreateUser
, um ein neues Benutzerkonto über das Membership
Membership-Framework zu erstellen. Diese Methode verfügt über Eingabeparameter für den Benutzernamen, das Kennwort und andere benutzerbezogene Felder. Beim Aufruf delegiert er die Erstellung des neuen Benutzerkontos an den konfigurierten Mitgliedschaftsanbieter und gibt dann ein MembershipUser
Objekt zurück, das das gerade erstellte Benutzerkonto darstellt.
Die CreateUser
-Methode verfügt über vier Überladungen, von denen jede eine andere Anzahl von Eingabeparametern akzeptiert:
CreateUser(username, password)
CreateUser(username, password, email)
CreateUser(username, password, email, passwordQuestion, passwordAnswer, isApproved, MembershipCreateStatus)
CreateUser(username, password, email, passwordQuestion, passwordAnswer, isApproved, providerUserKey, MembershipCreateStatus)
Diese vier Überladungen unterscheiden sich hinsichtlich der Menge der gesammelten Informationen. Die erste Überladung erfordert beispielsweise nur den Benutzernamen und das Kennwort für das neue Benutzerkonto, während die zweite ebenfalls die E-Mail-Adresse des Benutzers erfordert.
Diese Überladungen sind vorhanden, da die zum Erstellen eines neuen Benutzerkontos erforderlichen Informationen von den Konfigurationseinstellungen des Mitgliedschaftsanbieters abhängen. Im Tutorial Erstellen des Mitgliedschaftsschemas in SQL Server haben wir die Angabe von Konfigurationseinstellungen des Mitgliedschaftsanbieters in untersucht.Web.config
Tabelle 2 enthält eine vollständige Liste der Konfigurationseinstellungen.
Eine solche Konfigurationseinstellung des Mitgliedschaftsanbieters, die sich darauf auswirkt, welche CreateUser
Überladungen verwendet werden können, ist die requiresQuestionAndAnswer
Einstellung. Wenn requiresQuestionAndAnswer
auf true
festgelegt ist (Standard), müssen wir beim Erstellen eines neuen Benutzerkontos eine Sicherheitsfrage und -antwort angeben. Diese Informationen werden später verwendet, wenn der Benutzer sein Kennwort zurücksetzen oder ändern muss. Insbesondere zu diesem Zeitpunkt wird ihnen die Sicherheitsfrage angezeigt, und sie müssen die richtige Antwort eingeben, um ihr Kennwort zurückzusetzen oder zu ändern. Wenn also auf requiresQuestionAndAnswer
festgelegt ist, führt das Aufrufen einer der ersten beiden CreateUser
Überladungen zu true
einer Ausnahme, da die Sicherheitsfrage und -antwort fehlt. Da unsere Anwendung derzeit so konfiguriert ist, dass eine Sicherheitsfrage und -antwort erforderlich ist, müssen wir beim programmgesteuerten Erstellen des Benutzers eine der beiden letzten Überladungen verwenden.
Um die Verwendung der CreateUser
-Methode zu veranschaulichen, erstellen wir eine Benutzeroberfläche, in der wir den Benutzer zur Eingabe seines Namens, Kennworts, seiner E-Mail-Adresse und einer Antwort auf eine vordefinierte Sicherheitsfrage auffordern. Öffnen Sie die CreatingUserAccounts.aspx
Seite im Membership
Ordner, und fügen Sie dem Inhaltssteuerelement die folgenden Websteuerelemente hinzu:
- Ein Textfeld mit dem Namen
Username
- Ein TextBox-Element mit dem Namen
Password
, dessenTextMode
-Eigenschaft auf festgelegt istPassword
- Ein Textfeld mit dem Namen
Email
- Eine Bezeichnung mit dem Namen
SecurityQuestion
mitText
deaktivierter Eigenschaft - Ein Textfeld mit dem Namen
SecurityAnswer
- Eine Schaltfläche mit dem Namen
CreateAccountButton
, derenText
Eigenschaft auf Create the User Account (Benutzerkonto erstellen) festgelegt ist - Ein Label-Steuerelement namens
CreateAccountResults
mit deaktivierterText
Eigenschaft
An diesem Punkt sollte der Bildschirm in etwa wie in Abbildung 6 dargestellt aussehen.
Abbildung 6: Hinzufügen der verschiedenen Websteuerelemente zu (CreatingUserAccounts.aspx Page
Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Label SecurityQuestion
und SecurityAnswer
TextBox sollen eine vordefinierte Sicherheitsfrage anzeigen und die Antwort des Benutzers sammeln. Beachten Sie, dass sowohl die Sicherheitsfrage als auch die Antwort auf Benutzerbasis gespeichert werden, sodass jeder Benutzer seine eigene Sicherheitsfrage definieren kann. Für dieses Beispiel habe ich mich jedoch für eine universelle Sicherheitsfrage entschieden, nämlich: Was ist Ihre Lieblingsfarbe?
Um diese vordefinierte Sicherheitsfrage zu implementieren, fügen Sie der CodeBehind-Klasse der Seite eine Konstante mit dem Namen passwordQuestion
hinzu, und weisen Sie ihr die Sicherheitsfrage zu. Weisen Sie dann im Page_Load
Ereignishandler diese Konstante der SecurityQuestion
Label-Eigenschaft Text
zu:
Const passwordQuestion As String = "What is your favorite color"
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not Page.IsPostBack Then
SecurityQuestion.Text = passwordQuestion
End If
End Sub
Erstellen Sie als Nächstes einen Ereignishandler für das CreateAccountButton'
s-Ereignis Click
, und fügen Sie den folgenden Code hinzu:
Protected Sub CreateAccountButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles CreateAccountButton.Click
Dim createStatus As MembershipCreateStatus
Dim newUser As MembershipUser = _
Membership.CreateUser(Username.Text, Password.Text, _
Email.Text, passwordQuestion, _
SecurityAnswer.Text, True, _
createStatus)
Select Case createStatus
Case MembershipCreateStatus.Success
CreateAccountResults.Text = "The user account was successfully created!"
Case MembershipCreateStatus.DuplicateUserName
CreateAccountResults.Text = "There already exists a user with this username."
Case MembershipCreateStatus.DuplicateEmail
CreateAccountResults.Text = "There already exists a user with this email address."
Case MembershipCreateStatus.InvalidEmail
CreateAccountResults.Text = "There email address you provided in invalid."
Case MembershipCreateStatus.InvalidAnswer
CreateAccountResults.Text = "There security answer was invalid."
Case MembershipCreateStatus.InvalidPassword
CreateAccountResults.Text = "The password you provided is invalid. It must be seven characters long and have at least one non-alphanumeric character."
Case Else
CreateAccountResults.Text = "There was an unknown error; the user account was NOT created."
End Select
End Sub
Der Click
Ereignishandler beginnt mit der Definition einer Variablen mit dem Namen createStatus
vom Typ MembershipCreateStatus
. MembershipCreateStatus
ist eine Enumeration, die die status des CreateUser
Vorgangs angibt. Wenn das Benutzerkonto beispielsweise erfolgreich erstellt wurde, wird die resultierende MembershipCreateStatus
instance auf den Wert von Success;
festgelegt. Wenn der Vorgang fehlschlägt, da bereits ein Benutzer mit demselben Benutzernamen vorhanden ist, wird er auf den Wert festgelegtDuplicateUserName
. In der CreateUser
von uns verwendeten Überladung müssen wir eine MembershipCreateStatus
instance an die -Methode übergeben. Dieser Parameter wird auf den entsprechenden Wert innerhalb der CreateUser
Methode festgelegt, und wir können seinen Wert nach dem Methodenaufruf untersuchen, um zu ermitteln, ob das Benutzerkonto erfolgreich erstellt wurde.
Nach dem Aufrufen CreateUser
von wird createStatus
eine Select Case
-Anweisung verwendet, um eine entsprechende Nachricht abhängig vom zugewiesenen Wert auszugeben createStatus
. Abbildung 7 zeigt die Ausgabe, wenn ein neuer Benutzer erfolgreich erstellt wurde. Die Abbildungen 8 und 9 zeigen die Ausgabe, wenn das Benutzerkonto nicht erstellt wird. In Abbildung 8 hat der Besucher ein Kennwort aus fünf Buchstaben eingegeben, das nicht den Anforderungen an die Kennwortstärke entspricht, die in den Konfigurationseinstellungen des Mitgliedschaftsanbieters beschrieben sind. In Abbildung 9 versucht der Besucher, ein Benutzerkonto mit einem vorhandenen Benutzernamen (dem in Abbildung 7 erstellten) zu erstellen.
Abbildung 7: Ein neues Benutzerkonto wurde erfolgreich erstellt (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Abbildung 8: Das Benutzerkonto wird nicht erstellt, weil das angegebene Kennwort zu schwach ist (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Abbildung 9: Das Benutzerkonto wird nicht erstellt, da der Benutzername bereits verwendet wird (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Hinweis
Möglicherweise fragen Sie sich, wie Sie Erfolg oder Fehler ermitteln können, wenn Sie eine der ersten beiden CreateUser
Methodenüberladungen verwenden, von denen keine über einen Parameter vom Typ MembershipCreateStatus
verfügt. Diese ersten beiden Überladungen lösen angesichts eines Fehlers eine MembershipCreateUserException
Ausnahme aus, die eine StatusCode
-Eigenschaft vom Typ MembershipCreateStatus
enthält.
Nachdem Sie einige Benutzerkonten erstellt haben, überprüfen Sie, ob die Konten erstellt wurden, indem Sie den Inhalt der aspnet_Users
Tabellen und aspnet_Membership
in der SecurityTutorials.mdf
Datenbank auflisten. Wie Abbildung 10 zeigt, habe ich zwei Benutzer über die CreatingUserAccounts.aspx
Seite hinzugefügt: Tito und Bruce.
Abbildung 10: Es gibt zwei Benutzer im Mitgliedschaftsbenutzerspeicher: Tito und Bruce (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Während der Mitgliedschaftsbenutzerspeicher jetzt Die Kontoinformationen von Bruce und Tito enthält, müssen wir noch Funktionen implementieren, die es Bruce oder Tito ermöglichen, sich bei der Website anzumelden. Login.aspx
Derzeit überprüft die Anmeldeinformationen des Benutzers anhand einer hartcodierten Gruppe von Benutzernamen-Kennwort-Paaren. Die angegebenen Anmeldeinformationen werden nicht mit dem Mitgliedschaftsframework überprüft. Vorerst müssen die neuen Benutzerkonten in den aspnet_Users
Tabellen und aspnet_Membership
ausreichen. Im nächsten Tutorial, Überprüfen von Benutzeranmeldeinformationen für den Mitgliedschaftsbenutzerspeicher, aktualisieren wir die Anmeldeseite, um die Überprüfung anhand des Mitgliedschaftsspeichers durchzuführen.
Hinweis
Wenn in Ihrer SecurityTutorials.mdf
Datenbank keine Benutzer angezeigt werden, kann dies daran zurückzuführen sein, dass Ihre Webanwendung den Standardmäßigmitgliedschaftsanbieter verwendet, AspNetSqlMembershipProvider
der die ASPNETDB.mdf
Datenbank als Benutzerspeicher verwendet. Um festzustellen, ob dies das Problem ist, klicken Sie im Projektmappen-Explorer auf die Schaltfläche Aktualisieren. Wenn dem App_Data
Ordner eine Datenbank namens ASPNETDB.mdf
hinzugefügt wurde, ist dies das Problem. Kehren Sie zu Schritt 4 des Tutorials Erstellen des Mitgliedschaftsschemas in SQL Server Anweisungen zum ordnungsgemäßen Konfigurieren des Mitgliedschaftsanbieters zurück.
In den meisten Szenarien zum Erstellen eines Benutzerkontos wird dem Besucher eine Benutzeroberfläche angezeigt, über die er seinen Benutzernamen, sein Kennwort, seine E-Mail-Adresse und andere wichtige Informationen eingeben kann. An diesem Punkt wird ein neues Konto erstellt. In diesem Schritt haben wir uns das Erstellen einer solchen Schnittstelle von Hand angesehen und dann erfahren, wie sie die Membership.CreateUser
-Methode verwenden, um das neue Benutzerkonto basierend auf den Eingaben des Benutzers programmgesteuert hinzuzufügen. Unser Code hat jedoch gerade das neue Benutzerkonto erstellt. Es wurden keine Folgeaktionen ausgeführt, z. B. die Anmeldung des Benutzers bei der Website unter dem soeben erstellten Benutzerkonto oder das Senden einer Bestätigungs-E-Mail an den Benutzer. Diese zusätzlichen Schritte erfordern zusätzlichen Code im Ereignishandler der Click
Schaltfläche.
ASP.NET wird mit dem CreateUserWizard-Steuerelement ausgeliefert, das für die Verarbeitung des Erstellungsprozesses von Benutzerkonten konzipiert ist, vom Rendern einer Benutzeroberfläche zum Erstellen neuer Benutzerkonten über das Erstellen des Kontos im Mitgliedschaftsframework bis hin zum Ausführen von Aufgaben zur Kontoerstellung nach dem Erstellen von Konten, z. B. das Senden einer Bestätigungs-E-Mail und das Protokollieren des gerade erstellten Benutzers auf der Website. Die Verwendung des CreateUserWizard-Steuerelements ist so einfach wie das Ziehen des CreateUserWizard-Steuerelements aus der Toolbox auf eine Seite und anschließendes Festlegen einiger Eigenschaften. In den meisten Fällen müssen Sie keine einzige Codezeile schreiben. Dieses raffinierte Steuerelement wird in Schritt 6 ausführlich untersucht.
Wenn neue Benutzerkonten nur über eine typische Webseite zum Erstellen eines Kontos erstellt werden, ist es unwahrscheinlich, dass Sie jemals Code schreiben müssen, der die CreateUser
-Methode verwendet, da das CreateUserWizard-Steuerelement wahrscheinlich Ihren Anforderungen entspricht. Die Methode ist jedoch praktisch in Szenarien, CreateUser
in denen Sie eine hochgradig angepasste Benutzeroberfläche zum Erstellen eines Kontos benötigen oder wenn Sie neue Benutzerkonten programmgesteuert über eine alternative Benutzeroberfläche erstellen müssen. Beispielsweise können Sie über eine Seite verfügen, die es einem Benutzer ermöglicht, eine XML-Datei hochzuladen, die Benutzerinformationen aus einer anderen Anwendung enthält. Die Seite analysiert möglicherweise den Inhalt der hochgeladenen XML-Datei und erstellt durch Aufrufen CreateUser
der -Methode ein neues Konto für jeden Benutzer, der in der XML dargestellt wird.
Schritt 6: Erstellen eines neuen Benutzers mit dem CreateUserWizard-Steuerelement
ASP.NET wird mit einer Reihe von Anmeldewebsteuerelementen ausgeliefert. Diese Steuerelemente unterstützen in vielen gängigen Szenarien im Zusammenhang mit Benutzerkonten und Anmeldungen. Das CreateUserWizard-Steuerelement ist ein solches Steuerelement, das eine Benutzeroberfläche zum Hinzufügen eines neuen Benutzerkontos zum Mitgliedschaftsframework darstellen soll.
Wie viele der anderen Login-bezogenen Websteuerelemente kann createUserWizard verwendet werden, ohne eine einzige Codezeile zu schreiben. Es stellt intuitiv eine Benutzeroberfläche bereit, die auf den Konfigurationseinstellungen des Mitgliedschaftsanbieters basiert, und ruft intern die -Methode der Membership
CreateUser
Klasse auf, nachdem der Benutzer die erforderlichen Informationen eingegeben und auf die Schaltfläche Benutzer erstellen klickt. Das CreateUserWizard-Steuerelement ist äußerst anpassbar. Es gibt eine Vielzahl von Ereignissen, die während verschiedener Phasen des Kontoerstellungsprozesses ausgelöst werden. Wir können bei Bedarf Ereignishandler erstellen, um benutzerdefinierte Logik in den Kontoerstellungsworkflow einzufügen. Darüber hinaus ist das Erscheinungsbild des CreateUserWizard sehr flexibel. Es gibt eine Reihe von Eigenschaften, die die Darstellung der Standardschnittstelle definieren. Bei Bedarf kann das Steuerelement in eine Vorlage konvertiert werden, oder es können weitere Schritte zur Benutzerregistrierung hinzugefügt werden.
Beginnen wir mit der Verwendung der Standardschnittstelle und des Standardverhaltens des CreateUserWizard-Steuerelements. Anschließend erfahren Sie, wie Sie die Darstellung über die Eigenschaften und Ereignisse des Steuerelements anpassen.
Untersuchen der Standardschnittstelle und des Standardverhaltens von CreateUserWizard
Kehren Sie zur CreatingUserAccounts.aspx
Seite im Membership
Ordner zurück, wechseln Sie in den Modus Entwurf oder Geteilt, und fügen Sie dann oben auf der Seite ein CreateUserWizard-Steuerelement hinzu. Das CreateUserWizard-Steuerelement wird im Abschnitt Anmeldesteuerelemente der Toolbox abgelegt. Legen Sie nach dem Hinzufügen des Steuerelements seine ID
-Eigenschaft auf fest RegisterUser
. Wie der Screenshot in Abbildung 11 zeigt, rendert CreateUserWizard eine Benutzeroberfläche mit Textfeldern für benutzername, Kennwort, E-Mail-Adresse und Sicherheitsfragen des neuen Benutzers.
Abbildung 11: Das CreateUserWizard-Steuerelement rendert eine generische Benutzeroberfläche zum Erstellen (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Lassen Sie uns einen Moment zeit nehmen, um die vom CreateUserWizard-Steuerelement generierte Standardbenutzeroberfläche mit der In Schritt 5 erstellten Schnittstelle zu vergleichen. Für den Anfang ermöglicht das CreateUserWizard-Steuerelement dem Besucher, sowohl die Sicherheitsfrage als auch die Antwort anzugeben, während die manuell erstellte Schnittstelle eine vordefinierte Sicherheitsfrage verwendet. Die Schnittstelle des CreateUserWizard-Steuerelements enthält auch Validierungssteuerelemente, während wir noch eine Validierung für die Formularfelder der Schnittstelle implementieren mussten. Und die CreateUserWizard-Steuerelementschnittstelle enthält ein Textfeld Kennwort bestätigen (zusammen mit einem CompareValidator, um sicherzustellen, dass der in die Textfelder Kennwort und Kennwort vergleichen eingegebenen Text gleich sind).
Interessant ist, dass das CreateUserWizard-Steuerelement beim Rendern der Benutzeroberfläche die Konfigurationseinstellungen des Mitgliedschaftsanbieters einleitet. Beispielsweise werden die Textfelder für Sicherheitsfragen und -antworten nur angezeigt, wenn requiresQuestionAndAnswer
auf True festgelegt ist. Ebenso fügt CreateUserWizard automatisch ein RegularExpressionValidator-Steuerelement hinzu, um sicherzustellen, dass die Anforderungen an die Kennwortstärke erfüllt sind, und legt seine ErrorMessage
Eigenschaften und ValidationExpression
basierend auf den minRequiredPasswordLength
Konfigurationseinstellungen , minRequiredNonalphanumericCharacters
und passwordStrengthRegularExpression
fest.
Das CreateUserWizard-Steuerelement wird, wie der Name schon sagt, vom Assistenten-Steuerelement abgeleitet. Assistentensteuerelemente sind so konzipiert, dass sie eine Schnittstelle zum Ausführen von aufgaben in mehreren Schritten bereitstellen. Ein Assistent-Steuerelement kann eine beliebige Anzahl von WizardSteps
aufweisen, von denen jedes eine Vorlage ist, die die HTML- und Websteuerelemente für diesen Schritt definiert. Das Assistent-Steuerelement zeigt zunächst den ersten WizardStep
zusammen mit Navigationssteuerelementen an, mit denen der Benutzer von einem Schritt zum nächsten fortfahren oder zu den vorherigen Schritten zurückkehren kann.
Wie das deklarative Markup in Abbildung 11 zeigt, umfasst die Standardschnittstelle des CreateUserWizard-Steuerelements zwei WizardStep
s:
CreateUserWizardStep
? rendert die Schnittstelle, um Informationen zum Erstellen des neuen Benutzerkontos zu sammeln. Dies ist der Schritt in Abbildung 11.CompleteWizardStep
? rendert eine Meldung, die angibt, dass das Konto erfolgreich erstellt wurde.
Die Darstellung und das Verhalten des CreateUserWizard können geändert werden, indem Sie einen dieser Schritte in Vorlagen konvertieren oder eigene WizardStep
s hinzufügen. Im Tutorial Zum Speichern zusätzlicher Benutzerinformationen erfahren Sie, wie Sie der Registrierungsschnittstelle hinzufügenWizardStep
.
Sehen wir uns das CreateUserWizard-Steuerelement in Aktion an. Besuchen Sie die CreatingUserAccounts.aspx
Seite über einen Browser. Geben Sie zunächst einige ungültige Werte in die CreateUserWizard-Schnittstelle ein. Versuchen Sie, ein Kennwort einzugeben, das nicht den Anforderungen an die Kennwortsicherheit entspricht, oder lassen Sie das Textfeld Benutzername leer. CreateUserWizard zeigt eine entsprechende Fehlermeldung an. Abbildung 12 zeigt die Ausgabe, wenn versucht wird, einen Benutzer mit einem unzureichend sicheren Kennwort zu erstellen.
Abbildung 12: Die CreateUserWizard Fügt Validierungssteuerelemente automatisch ein (klicken, um das Bild in voller Größe anzuzeigen)
Geben Sie als Nächstes die entsprechenden Werte in createUserWizard ein, und klicken Sie auf die Schaltfläche Benutzer erstellen. Unter der Annahme, dass die erforderlichen Felder eingegeben wurden und die Kennwortstärke ausreichend ist, erstellt createUserWizard über das Mitgliedschaftsframework ein neues Benutzerkonto und zeigt dann die Benutzeroberfläche des CompleteWizardStep
-Computers an (siehe Abbildung 13). Im Hintergrund ruft createUserWizard die Membership.CreateUser
-Methode auf, genau wie in Schritt 5.
Abbildung 13: Ein neues Benutzerkonto wurde erfolgreich erstellt (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Hinweis
Wie Abbildung 13 zeigt, enthält die CompleteWizardStep
-Schnittstelle eine Schaltfläche Weiter. Wenn Sie an diesem Punkt darauf klicken, wird jedoch nur ein Postback ausgeführt, sodass der Besucher auf derselben Seite bleibt. Im Abschnitt Anpassen der Darstellung und des Verhaltens des CreateUserWizard über seine Eigenschaften wird erläutert, wie Sie diese Schaltfläche dazu verwenden können, den Besucher an (oder eine andere Seite) zu Default.aspx
senden.
Kehren Sie nach dem Erstellen eines neuen Benutzerkontos zu Visual Studio zurück, und überprüfen Sie die aspnet_Users
Tabellen und aspnet_Membership
wie in Abbildung 10, um zu überprüfen, ob das Konto erfolgreich erstellt wurde.
Anpassen des Verhaltens und der Darstellung des CreateUserWizard über seine Eigenschaften
CreateUserWizard kann auf verschiedene Weise über Eigenschaften, WizardStep
S und Ereignishandler angepasst werden. In diesem Abschnitt erfahren Sie, wie Sie das Erscheinungsbild des Steuerelements über seine Eigenschaften anpassen. Der nächste Abschnitt befasst sich mit der Erweiterung des Steuerelementverhaltens durch Ereignishandler.
Praktisch der gesamte Text, der in der Standardbenutzeroberfläche des CreateUserWizard-Steuerelements angezeigt wird, kann über seine Vielzahl von Eigenschaften angepasst werden. Beispielsweise können die Bezeichnungen Benutzername, Kennwort, Kennwort bestätigen, E-Mail, Sicherheitsfrage und Sicherheitsantwort, die links neben den Textfelder angezeigt werden, durch die UserNameLabelText
Eigenschaften , PasswordLabelText
, ConfirmPasswordLabelText
, EmailLabelText
QuestionLabelText
, und AnswerLabelText
angepasst werden. Ebenso gibt es Eigenschaften zum Angeben des Texts für die Schaltflächen "Benutzer erstellen" und "Weiter" in und CreateUserWizardStep
CompleteWizardStep
sowie zum Angeben, ob diese Schaltflächen als Schaltflächen, LinkButtons oder ImageButtons gerendert werden.
Die Farben, Rahmen, Schriftarten und andere visuelle Elemente können über eine Vielzahl von Stileigenschaften konfiguriert werden. Das CreateUserWizard-Steuerelement selbst verfügt über die allgemeinen Websteuerelementstileigenschaften - BackColor
, BorderStyle
CssClass
, , Font
usw. - und es gibt eine Reihe von Stileigenschaften zum Definieren der Darstellung für bestimmte Abschnitte der CreateUserWizard-Schnittstelle. Die TextBoxStyle
-Eigenschaft für instance definiert die Formatvorlagen für die Textfelder im CreateUserWizardStep
, während die TitleTextStyle
-Eigenschaft die Formatvorlage für den Titel definiert ( Registrieren Sie sich für Ihr neues Konto ).
Zusätzlich zu den darstellungsbezogenen Eigenschaften gibt es eine Reihe von Eigenschaften, die sich auf das Verhalten des CreateUserWizard-Steuerelements auswirken. Wenn DisplayCancelButton
die -Eigenschaft auf True festgelegt ist, zeigt die Schaltfläche Abbrechen neben der Schaltfläche Benutzer erstellen an (der Standardwert ist False). Wenn Sie die Schaltfläche Abbrechen anzeigen, müssen Sie auch die CancelDestinationPageUrl
-Eigenschaft festlegen, die die Seite angibt, an die der Benutzer nach dem Klicken auf Abbrechen gesendet wird. Wie im vorherigen Abschnitt erwähnt, verursacht die Schaltfläche Weiter in der CompleteWizardStep
-Schnittstelle von ein Postback, lässt den Besucher jedoch auf derselben Seite. Um den Besucher nach dem Klicken auf die Schaltfläche Weiter zu einer anderen Seite zu senden, geben Sie einfach die URL in der ContinueDestinationPageUrl
-Eigenschaft an.
Lassen Sie uns das RegisterUser
CreateUserWizard-Steuerelement aktualisieren, um eine Schaltfläche Abbrechen anzuzeigen und den Besucher zu Default.aspx
senden, wenn auf die Schaltflächen Abbrechen oder Fortfahren geklickt wird. Legen Sie dazu die DisplayCancelButton
Eigenschaft auf True und die CancelDestinationPageUrl
Eigenschaften und ContinueDestinationPageUrl
auf ~/Default.aspx fest. Abbildung 14 zeigt den aktualisierten CreateUserWizard, wenn es über einen Browser angezeigt wird.
Abbildung 14: Die CreateUserWizardStep
Schaltfläche "Abbrechen" enthält (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Wenn ein Besucher einen Benutzernamen, ein Kennwort, eine E-Mail-Adresse sowie eine Sicherheitsfrage und -antwort eingibt und auf Benutzer erstellen klickt, wird ein neues Benutzerkonto erstellt, und der Besucher wird als dieser neu erstellte Benutzer angemeldet. Unter der Annahme, dass die Person, die die Seite besucht, ein neues Konto für sich selbst erstellt, ist dies wahrscheinlich das gewünschte Verhalten. Möglicherweise möchten Sie administratoren jedoch das Hinzufügen neuer Benutzerkonten gestatten. Dabei würde das Benutzerkonto erstellt, aber der Administrator bleibt als Administrator (und nicht als neu erstelltes Konto) angemeldet. Dieses Verhalten kann über die boolesche LoginCreatedUser
Eigenschaft geändert werden.
Benutzerkonten im Mitgliedschaftsframework enthalten ein genehmigtes Flag. Benutzer, die nicht genehmigt wurden, können sich nicht bei der Website anmelden. Standardmäßig wird ein neu erstelltes Konto als genehmigt gekennzeichnet, sodass sich der Benutzer sofort bei der Website anmelden kann. Es ist jedoch möglich, neue Benutzerkonten als nicht genehmigt gekennzeichnet zu lassen. Vielleicht möchten Sie, dass ein Administrator neue Benutzer manuell genehmigt, bevor sie sich anmelden können. Oder vielleicht möchten Sie überprüfen, ob die bei der Registrierung eingegebene E-Mail-Adresse gültig ist, bevor Sie einem Benutzer die Anmeldung erlauben. In jedem Fall können Sie das neu erstellte Benutzerkonto als nicht genehmigt markieren lassen, indem Sie die Eigenschaft des CreateUserWizard-Steuerelements DisableCreatedUser
auf True festlegen (der Standardwert ist False).
Weitere verhaltensbezogene Eigenschaften von Note sind AutoGeneratePassword
und MailDefinition
. Wenn die AutoGeneratePassword
-Eigenschaft auf True festgelegt ist, CreateUserWizardStep
werden die Textfelder Kennwort und Kennwort bestätigen nicht angezeigt. Stattdessen wird das Kennwort des neu erstellten Benutzers automatisch mithilfe der -Methode der Membership
-KlasseGeneratePassword
generiert. Die GeneratePassword
-Methode erstellt ein Kennwort mit einer angegebenen Länge und einer ausreichenden Anzahl von nicht alphanumerischen Zeichen, um die konfigurierten Anforderungen an die Kennwortstärke zu erfüllen.
Die MailDefinition
-Eigenschaft ist nützlich, wenn Sie eine E-Mail an die E-Mail-Adresse senden möchten, die während des Kontoerstellungsprozesses angegeben wurde. Die MailDefinition
-Eigenschaft enthält eine Reihe von Untereigenschaften zum Definieren von Informationen über die erstellte E-Mail-Nachricht. Diese Untereigenschaften umfassen Optionen wie Subject
, , Priority
IsBodyHtml
, From
, CC
und BodyFileName
. Die BodyFileName
-Eigenschaft zeigt auf eine Text- oder HTML-Datei, die den Text für die E-Mail-Nachricht enthält. Der Text unterstützt zwei vordefinierte Platzhalter: <%UserName%>
und <%Password%>
. Diese Platzhalter werden, sofern sie in der BodyFileName
Datei vorhanden sind, durch den Namen und das Kennwort des soeben erstellten Benutzers ersetzt.
Hinweis
Die CreateUserWizard
-Eigenschaft des Steuerelements MailDefinition
gibt nur Details zu der E-Mail-Nachricht an, die beim Erstellen eines neuen Kontos gesendet wird. Es enthält keine Details dazu, wie die E-Mail-Nachricht tatsächlich gesendet wird (d. a. ob ein SMTP-Server oder ein E-Mail-Drop-Verzeichnis verwendet wird, irgendwelche Authentifizierungsinformationen usw.). Diese Details auf niedriger Ebene müssen im <system.net>
Abschnitt in Web.config
definiert werden. Weitere Informationen zu diesen Konfigurationseinstellungen und zum Senden von E-Mails von ASP.NET 2.0 im Allgemeinen finden Sie in den häufig gestellten Fragen unter SystemNetMail.com und in meinem Artikel Senden von Email in ASP.NET 2.0.
Erweitern des CreateUserWizard-Verhaltens mithilfe von Ereignishandlern
Das CreateUserWizard-Steuerelement löst während des Workflows eine Reihe von Ereignissen aus. Nachdem ein Besucher beispielsweise seinen Benutzernamen, sein Kennwort und andere relevante Informationen eingegeben und auf die Schaltfläche Benutzer erstellen klickt, löst das CreateUserWizard-Steuerelement sein Ereignis ausCreatingUser
. Wenn während des Erstellungsprozesses ein Problem auftritt, wird das CreateUserError
Ereignis ausgelöst. Wenn der Benutzer jedoch erfolgreich erstellt wurde, wird das CreatedUser
Ereignis ausgelöst. Es gibt zusätzliche CreateUserWizard-Steuerelementereignisse, die ausgelöst werden, aber dies sind die drei am häufigsten deutschen.
In bestimmten Szenarien möchten wir möglicherweise auf den CreateUserWizard-Workflow tippen, was wir tun können, indem wir einen Ereignishandler für das entsprechende Ereignis erstellen. Um dies zu veranschaulichen, erweitern wir das RegisterUser
CreateUserWizard-Steuerelement, um eine benutzerdefinierte Überprüfung für Den Benutzernamen und das Kennwort einzuschließen. Verbessern wir insbesondere unseren CreateUserWizard, sodass Benutzernamen keine führenden oder nachfolgenden Leerzeichen enthalten können und der Benutzername an keinem beliebigen Ort im Kennwort angezeigt werden kann. Kurz gesagt, wir möchten verhindern, dass jemand einen Benutzernamen wie "Scott" erstellt oder eine Kombination aus Benutzername und Kennwort wie Scott und Scott.1234 verwendet.
Um dies zu erreichen, erstellen wir einen Ereignishandler für das CreatingUser
Ereignis, um unsere zusätzlichen Überprüfungen durchzuführen. Wenn die angegebenen Daten ungültig sind, müssen wir den Erstellungsprozess abbrechen. Außerdem müssen wir der Seite ein Label Web-Steuerelement hinzufügen, um eine Meldung anzuzeigen, in der erklärt wird, dass der Benutzername oder das Kennwort ungültig ist. Fügen Sie zunächst ein Label-Steuerelement unter dem CreateUserWizard-Steuerelement hinzu, und legen Sie dessen ID
-Eigenschaft auf InvalidUserNameOrPasswordMessage
und seine ForeColor
-Eigenschaft auf fest Red
. Löschen Sie die - Text
Eigenschaft, und legen Sie die EnableViewState
Eigenschaften und Visible
auf False fest.
<asp:Label runat="server"" id="InvalidUserNameOrPasswordMessage"
Visible="false" ForeColor="Red" EnableViewState="false">
</asp:Label>
Erstellen Sie als Nächstes einen Ereignishandler für das Ereignis des CreatingUser
CreateUserWizard-Steuerelements. Um einen Ereignishandler zu erstellen, wählen Sie das Steuerelement im Designer aus, und wechseln Sie dann zum Eigenschaftenfenster. Klicken Sie dort auf das Blitzsymbol, und doppelklicken Sie dann auf das entsprechende Ereignis, um den Ereignishandler zu erstellen.
Fügen Sie dem CreatingUser
-Ereignishandler folgenden Code hinzu:
Protected Sub RegisterUser_CreatingUser(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.LoginCancelEventArgs) Handles RegisterUser.CreatingUser
Dim trimmedUserName As String = RegisterUser.UserName.Trim()
If RegisterUser.UserName.Length <> trimmedUserName.Length Then
' Show the error message
InvalidUserNameOrPasswordMessage.Text = "The username cannot contain leading or trailing spaces."
InvalidUserNameOrPasswordMessage.Visible = True
' Cancel the create user workflow
e.Cancel = True
Else
' Username is valid, make sure that the password does not contain the username
If RegisterUser.Password.IndexOf(RegisterUser.UserName, StringComparison.OrdinalIgnoreCase) >= 0 Then
' Show the error message
InvalidUserNameOrPasswordMessage.Text = "The username may not appear anywhere in the password."
InvalidUserNameOrPasswordMessage.Visible = True
' Cancel the create user workflow
e.Cancel = True
End If
End If
End Sub
Beachten Sie, dass der Benutzername und das Kennwort, die in das CreateUserWizard-Steuerelement eingegeben wurden, über die UserName
Eigenschaften und Password
verfügbar sind. Wir verwenden diese Eigenschaften im obigen Ereignishandler, um zu bestimmen, ob der angegebene Benutzername führende oder nachfolgende Leerzeichen enthält und ob der Benutzername innerhalb des Kennworts gefunden wird. Wenn eine dieser Bedingungen erfüllt ist, wird eine Fehlermeldung in der InvalidUserNameOrPasswordMessage
Bezeichnung angezeigt, und die -Eigenschaft des Ereignishandlers e.Cancel
ist auf True
festgelegt. Wenn e.Cancel
auf True
festgelegt ist, wird der Workflow von CreateUserWizard kurzgeschlossen und der Erstellungsprozess des Benutzerkontos abgebrochen.
Abbildung 15 zeigt einen Screenshot, der zeigt CreatingUserAccounts.aspx
, wann der Benutzer einen Benutzernamen mit führenden Leerzeichen eingibt.
Abbildung 15: Benutzernamen mit führenden oder nachgestellten Leerzeichen sind nicht zulässig (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)
Hinweis
Ein Beispiel für die Verwendung des Ereignisses CreatedUser
des CreateUserWizard-Steuerelements finden Sie im Tutorial Zum Speichern zusätzlicher Benutzerinformationen.
Zusammenfassung
Die Membership
-Methode der CreateUser
-Klasse erstellt ein neues Benutzerkonto im Membership-Framework. Dazu delegiert er den Aufruf an den konfigurierten Mitgliedschaftsanbieter. Im Fall von SqlMembershipProvider
fügt die -Methode den CreateUser
aspnet_Users
Datenbanktabellen und aspnet_Membership
einen Datensatz hinzu.
Während neue Benutzerkonten programmgesteuert erstellt werden können (wie in Schritt 5 dargestellt), ist die Verwendung des CreateUserWizard-Steuerelements ein schnellerer und einfacherer Ansatz. Dieses Steuerelement rendert eine mehrstufige Benutzeroberfläche zum Sammeln von Benutzerinformationen und Erstellen eines neuen Benutzers im Mitgliedschaftsframework. Hinter den Hüllen verwendet dieses Steuerelement die gleiche Membership.CreateUser
Methode wie in Schritt 5 untersucht, aber das Steuerelement erstellt die Benutzeroberfläche und Validierungssteuerelemente und reagiert auf Fehler beim Erstellen von Benutzerkonten, ohne einen Lick von Code schreiben zu müssen.
An diesem Punkt verfügen wir über die Funktionalität, um neue Benutzerkonten zu erstellen. Die Anmeldeseite wird jedoch weiterhin anhand der hartcodierten Anmeldeinformationen überprüft, die wir im zweiten Tutorial angegeben haben. Im nächsten Tutorial wird aktualisiertLogin.aspx
, um die vom Benutzer angegebenen Anmeldeinformationen anhand des Mitgliedschaftsframeworks zu überprüfen.
Viel Spaß beim Programmieren!
Weitere Informationen
Weitere Informationen zu den in diesem Tutorial behandelten Themen finden Sie in den folgenden Ressourcen:
CreateUser
Technische Dokumentation- Übersicht über das CreateUserWizard-Steuerelement
- Erstellen eines Datei-System-Based-Siteübersichtsanbieters
- Erstellen einer schrittweisen Benutzeroberfläche mit dem ASP.NET 2.0-Assistentensteuerelement
- Untersuchen der Websitenavigation von ASP.NET 2.0
- Gestaltungsvorlagen und Websitenavigation
- Der SQL-Site map-Anbieter, auf den Sie gewartet haben
Zum Autor
Scott Mitchell, Autor mehrerer ASP/ASP.NET-Bücher und Gründer von 4GuysFromRolla.com, arbeitet seit 1998 mit Microsoft-Webtechnologien. Scott arbeitet als unabhängiger Berater, Trainer und Autor. Sein neuestes Buch ist Sams Teach Yourself ASP.NET 2.0 in 24 Hours. Scott kann unter mitchell@4guysfromrolla.com oder über seinen Blog unter http://ScottOnWriting.NETerreicht werden.
Besonderer Dank an
Diese Tutorialreihe wurde von vielen hilfreichen Prüfern überprüft. Leitende Prüferin für dieses Tutorial war Teresa Murphy. Möchten Sie meine bevorstehenden MSDN-Artikel lesen? Wenn dies der Fall ist, legen Sie eine Zeile unter ab mitchell@4GuysFromRolla.com.
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für