Hinzufügen von Benutzerkonten (VB)
von Scott Mitchell
Hinweis
Da dieser Artikel geschrieben wurde, werden die ASP.NET Mitgliedschaftsanbieter durch ASP.NET Identity ersetzt. Es wird dringend empfohlen, Apps so zu aktualisieren, dass sie die ASP.NET Identity Platform anstelle der Mitgliedschaftsanbieter verwenden, die zum Zeitpunkt dieses Artikels vorgestellt wurden. ASP.NET Identity hat 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
- Anspruchsbasierte Identitätsunterstützung
- Bessere Interoperabilität mit ASP.Net Core
Code herunterladen oder PDF herunterladen
In diesem Lernprogramm untersuchen wir die Verwendung des Mitgliedschaftsframeworks (über sqlMembershipProvider), um neue Benutzerkonten zu erstellen. Wir werden sehen, wie neue Benutzer programmgesteuert und über ASP erstellt werden. Das integrierte CreateUserWizard-Steuerelement von NET.
Einführung
Im vorherigen Lernprogramm haben wir das Anwendungsdienstschema in einer Datenbank installiert, in der die Tabellen, Ansichten und gespeicherten Prozeduren hinzugefügt wurden, die von den SqlMembershipProvider
und SqlRoleProvider
. Dadurch wurde die Infrastruktur erstellt, die wir für den Rest der Lernprogramme in dieser Reihe benötigen. In diesem Lernprogramm wird die Verwendung des Mitgliedschaftsframeworks (über das SqlMembershipProvider
) zum Erstellen neuer Benutzerkonten untersucht. Wir werden sehen, wie neue Benutzer programmgesteuert und über ASP erstellt werden. Das integrierte CreateUserWizard-Steuerelement von NET.
Zusätzlich zum Erlernen der Erstellung neuer Benutzerkonten müssen wir auch die Demowebsite aktualisieren, die wir zuerst im Lernprogramm "Übersicht über die Formularauthentifizierung " erstellt haben. Unsere Demowebanwendung verfügt über eine Anmeldeseite, auf der die Anmeldeinformationen der Benutzer anhand hartcodierter Benutzernamen-/Kennwortpaare überprüft werden. 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 im Mitgliedschaftsframework zu überprüfen und die benutzerdefinierte Prinzipal- und Identitätslogik zu entfernen.
Legen wir los.
Prüfliste "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 vor der Implementierung der Mitgliedschaftsfunktionen in Ihrer Webanwendung ausgeführt werden:
- Aktivieren der formularbasierten Authentifizierung. Wie in einer Übersicht über die Formularauthentifizierung erläutert, wird die Formularauthentifizierung durch Bearbeiten
Web.config
und Festlegen des<authentication>
Elementattributsmode
aktiviert.Forms
Bei aktivierter Formularauthentifizierung wird jede eingehende Anforderung auf ein Formularauthentifizierungsticket untersucht, das den Anforderer identifiziert, falls vorhanden. - Fügen Sie das Anwendungsdienstschema der entsprechenden Datenbank hinzu. Bei Verwendung des
SqlMembershipProvider
Anwendungsdienstschemas müssen wir ein Datenbankschema installieren. In der Regel wird dieses Schema derselben Datenbank hinzugefügt, die das Datenmodell der Anwendung enthält. Das Lernprogramm zum Erstellen des Mitgliedschaftsschemas in SQL Server untersuchte die Verwendung desaspnet_regsql.exe
Tools, um dies zu erreichen. - Passen Sie die Einstellungen der Webanwendung an, um aus Schritt 2 auf die Datenbank zu verweisen. Das Lernprogramm zum Erstellen des Mitgliedschaftsschemas in SQL Server zeigte zwei Möglichkeiten zum Konfigurieren der Webanwendung, sodass die
SqlMembershipProvider
in Schritt 2 ausgewählte Datenbank verwendet werden würde: durch Ändern desLocalSqlServer
Verbindungszeichenfolge Namens oder durch Hinzufügen eines neuen registrierten Anbieters zur Liste der Mitgliedschaftsframeworkanbieter und Anpassen dieses neuen Anbieters für die Verwendung der Datenbank aus Schritt 2.
Beim Erstellen einer Webanwendung, die die SqlMembershipProvider
formularbasierte Authentifizierung verwendet, müssen Sie diese drei Schritte ausführen, bevor Sie die Membership
Klasse oder die ASP.NET Anmeldewebsteuerelemente verwenden. Da wir diese Schritte bereits in früheren Lernprogrammen ausgeführt haben, können wir mit der Verwendung des Mitgliedschaftsframeworks beginnen!
Schritt 1: Hinzufügen neuer ASP.NET Seiten
In diesem Lernprogramm und den nächsten drei werden wir verschiedene mitgliedschaftsbezogene Funktionen und Funktionen untersuchen. Wir benötigen eine Reihe von ASP.NET Seiten, um die in diesen Lernprogrammen untersuchten Themen zu implementieren. Erstellen wir diese Seiten und dann eine Websitezuordnungsdatei (Web.sitemap)
.
Erstellen Sie zunächst einen neuen Ordner im Projekt mit dem Namen Membership
. Fügen Sie als Nächstes fünf neue ASP.NET Seiten zum Ordner hinzu Membership
, wobei jede Seite mit der Site.master
Gestaltungsvorlage verknüpft wird. Benennen Sie die Seiten:
CreatingUserAccounts.aspx
UserBasedAuthorization.aspx
EnhancedCreateUserWizard.aspx
AdditionalUserInfo.aspx
Guestbook.aspx
An diesem Punkt sollte die Projektmappen-Explorer Ihres Projekts ähnlich dem screenshot in Abbildung 1 aussehen.
Abbildung 1: Dem Ordner wurden fünf neue Seiten hinzugefügt Membership
(Klicken Sie, um das Bild in voller Größe anzuzeigen)
Jede Seite sollte an diesem Punkt über die beiden Inhaltssteuerelemente verfügen, eines für jede der ContentPlaceHolders der Gestaltungsvorlage: MainContent
und LoginContent
.
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent"
Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="LoginContent"
Runat="Server">
</asp:Content>
Erinnern Sie sich 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 Gestaltungsvorlage. Wie im Lernprogramm "Übersicht über die Formularauthentifizierung" beschrieben, ist dies auf Seiten hilfreich, 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 Gestaltungsvorlage für den LoginContent
ContentPlaceHolder anzeigen. Entfernen Sie daher das deklarative Markup für das Content2
Inhaltssteuerelement. Danach sollte jedes markup der fünf Seiten nur ein Inhaltssteuerelement enthalten.
Schritt 2: Erstellen der Websiteübersicht
Alle, aber die trivialsten Websites müssen eine Form einer navigationsbasierten 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 des Artikels. Wir benötigen auch einige Mittel, um die logische Struktur der Website in einer bearbeitbaren und aktualisierbaren Weise zu definieren. Wenn neue Seiten hinzugefügt oder vorhandene Seiten entfernt werden, möchten wir eine einzelne Quelle – die Websitekarte – aktualisieren und diese Änderungen auf der Navigationsbenutzeroberfläche der Website anzeigen lassen.
Diese beiden Aufgaben – Definieren der Websitekarte und Implementieren einer navigationsbasierten Benutzeroberfläche basierend auf der Websitekarte – sind dank des Websiteübersichtsframeworks und der in ASP.NET Version 2.0 hinzugefügten Navigationswebsteuerelemente einfach zu erledigen. Das Websitezuordnungsframework ermöglicht es einem Entwickler, eine Websitekarte zu definieren und dann über eine programmgesteuerte API (die SiteMap
Klasse) darauf zuzugreifen. Zu den integrierten Navigationswebsteuerelementen gehören ein Menüsteuerelement, das TreeView-Steuerelement und das SiteMapPath-Steuerelement.
Wie die Frameworks "Mitgliedschaft" und "Rollen" wird das Site Map-Framework auf dem Anbietermodell erstellt. Die Aufgabe der Sitezuordnungsanbieterklasse besteht darin, die speicherinterne Struktur zu generieren, die von der SiteMap
Klasse aus einem persistenten Datenspeicher verwendet wird, z. B. eine XML-Datei oder eine Datenbanktabelle. Das .NET Framework wird mit einem Standardmäßigen Siteübersichtsanbieter ausgeliefert, der die Websiteübersichtsdaten aus einer XML-Datei (XmlSiteMapProvider
) liest. Dies ist der Anbieter, den wir in diesem Lernprogramm verwenden werden. Einige alternative Implementierungen von Siteübersichtsanbietern finden Sie im Abschnitt "Weitere Informationen" am Ende dieses Lernprogramms.
Der Standardmäßige Websitezuordnungsanbieter 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 Websitezuordnung 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 die Option zum Hinzufügen einer Datei vom Typ "Site Map" aus Web.sitemap
.
Abbildung 2: Hinzufügen einer Datei mit dem Namen Web.sitemap
zum Stammverzeichnis des Projekts (Klicken Sie hier, um das Bild mit voller Größe anzuzeigen)
Die XML-Websitezuordnungsdatei 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 ein <siteMapNode>
untergeordnetes Element aufweist. Dieses Element der obersten Ebene <siteMapNode>
stellt den Stamm der Hierarchie dar und hat möglicherweise eine beliebige Anzahl von untergeordneten Knoten. Jedes <siteMapNode>
Element muss ein title
Attribut enthalten und kann optional auch Attribute enthalten description
url
, und 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 oben genannte Websitezuordnungsmarkup definiert die hierarchie in Abbildung 3.
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, um eine navigationsbasierte Benutzeroberfläche einzuschließen
ASP.NET enthält eine Reihe von navigationsbezogenen Websteuerelementen zum Entwerfen einer Benutzeroberfläche. Dazu gehören das Menü, die Strukturansicht und die SiteMapPath-Steuerelemente. Die Steuerelemente "Menu" und "TreeView" rendern die Websitezuordnungsstruktur in einem Menü oder einer Struktur, während der SiteMapPath ein Breadcrumb anzeigt, der den aktuellen Knoten anzeigt, der besucht wird, sowie seine Vorgänger. Die Websitekartendaten können mithilfe der SiteMapDataSource an andere Datenwebsteuerelemente gebunden werden und programmgesteuert über die SiteMap
Klasse aufgerufen werden.
Da eine gründliche Erläuterung des Websiteübersichtsframeworks und der Navigationssteuerelemente über den Umfang dieser Lernprogrammreihe hinausgeht, anstatt Zeit mit dem Erstellen unserer eigenen Navigationsbenutzeroberfläche zu verbringen, leihen wir stattdessen die in meiner Lernprogrammreihe "Arbeiten mit Daten" in ASP.NET 2.0-Lernprogrammreihe verwendete, die ein Repeater-Steuerelement verwendet, um eine zweitiefe Aufzählung von Navigationslinks anzuzeigen, wie in Abbildung 4 dargestellt.
Hinzufügen einer Liste mit Links auf zwei Ebenen in der linken Spalte
Um diese Schnittstelle zu erstellen, fügen Sie das folgende deklarative Markup zur linken Spalte der Site.master
Gestaltungsvorlage hinzu, in der der Text TODO steht: Das Menü wird hier angezeigt... 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, das an eine SiteMapDataSource benannt menu
ist, wodurch die in Web.sitemap
der Websitezuordnungshierarchie definierte Websitezuordnungshierarchie zurückgegeben wird. Da die Eigenschaft des SiteMapDataSource-Steuerelements ShowStartingNode
auf "False" festgelegt ist, wird die Hierarchie der Websitezuordnung beginnend mit den absteigenden Knoten des Startknotens zurückgegeben. Der Repeater zeigt jeden dieser Knoten (derzeit nur Mitgliedschaft) in einem <li>
Element an. Ein anderer, innerer Repeater zeigt dann die untergeordneten Elemente des aktuellen Knotens in einer geschachtelten nicht angeordneten Liste an.
Abbildung 4 zeigt die gerenderte Ausgabe des obigen Markups mit der Websitezuordnungsstruktur, die wir in Schritt 2 erstellt haben. Der Repeater rendert vanille ungeordnetes Listenmarkup; Die kaskadierenden Stylesheetregeln, die definiert Styles.css
sind, sind für das ästhetisch ansprechende Layout verantwortlich. Eine ausführlichere Beschreibung der Funktionsweise des obigen Markups finden Sie im Lernprogramm " Gestaltungsvorlagen" und "Websitenavigation" .
Abbildung 4: Die Navigationsbenutzeroberfläche wird mithilfe geschachtelter nicht sortierter Listen gerendert (Klicken Sie, um das Bild in voller Größe anzuzeigen)
Breadcrumb-Navigation hinzufügen
Neben der Liste der Links in der linken Spalte zeigen wir auch jede Seite ein Breadcrumb an. Ein Breadcrumb ist ein Navigationsbenutzeroberflächenelement, das Benutzern schnell ihre aktuelle Position innerhalb der Websitehierarchie anzeigt. Das SiteMapPath-Steuerelement verwendet das SiteMapPath-Framework, um die Position der aktuellen Seite in der Websitekarte zu ermitteln und dann basierend auf diesen Informationen ein Breadcrumb anzuzeigen.
Fügen Sie dem Kopfzeilenelement <div>
der Gestaltungsvorlage 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 ~/Membership/CreatingUserAccounts.aspx
.
Abbildung 5: Das Breadcrumb zeigt die aktuelle Seite und deren Vorgänger in der Websitekarte 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. Dazu haben wir einen Ereignishandler Global.asax
für das Ereignis der Anwendung PostAuthenticateRequest
erstellt, der ausgelöst wird, nachdem der FormsAuthenticationModule
Benutzer authentifiziert wurde. In diesem Ereignishandler wurden die und FormsIdentity
die GenericPrincipal
Objekte ersetzt, die von den FormsAuthenticationModule
CustomPrincipal
in diesem Lernprogramm erstellten Objekten und CustomIdentity
Objekten hinzugefügt wurden.
Benutzerdefinierte Prinzipal- und Identitätsobjekte sind zwar in bestimmten Szenarien nützlich, in den meisten Fällen sind die GenericPrincipal
Objekte jedoch FormsIdentity
ausreichend. Folglich würde es sich lohnen, zum Standardverhalten zurückzukehren. Nehmen Sie diese Änderung vor, indem Sie entweder den PostAuthenticateRequest
Ereignishandler entfernen oder kommentieren oder die Global.asax
Datei vollständig löschen.
Hinweis
Nachdem Sie den Code Global.asax
kommentiert oder entfernt haben, müssen Sie den Code in Default.aspx's
der CodeBehind-Klasse kommentieren, der die User.Identity
Eigenschaft in eine CustomIdentity
Instanz umgibt.
Schritt 5: Programmgesteuertes Erstellen eines neuen Benutzers
Verwenden Sie die Methode der Membership
KlasseCreateUser
, um über das Mitgliedschaftsframework ein neues Benutzerkonto zu erstellen. Diese Methode enthält Eingabeparameter für Benutzernamen, Kennwort und andere benutzerbezogene Felder. Bei Aufruf delegiert es 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, die jeweils eine andere Anzahl von Eingabeparametern akzeptieren:
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 von 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 auch 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 Lernprogramm zum Erstellen des Mitgliedschaftsschemas im SQL Server-Lernprogramm haben wir die Angabe der Konfigurationseinstellungen des Mitgliedschaftsanbieters in Web.config
. Tabelle 2 enthält eine vollständige Liste der Konfigurationseinstellungen.
Eine solche Konfigurationseinstellung des Mitgliedschaftsanbieters, die sich auf die CreateUser
Überladungen auswirkt, ist die requiresQuestionAndAnswer
Einstellung. Wenn requiresQuestionAndAnswer
dieser Wert auf (Standardeinstellung) festgelegt true
ist, 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 werden sie die Sicherheitsfrage angezeigt und müssen die richtige Antwort eingeben, um ihr Kennwort zurückzusetzen oder zu ändern. Wenn dies requiresQuestionAndAnswer
dann auf eine der ersten beiden CreateUser
Überladungen festgelegt true
ist, führt dies zu einer Ausnahme, da die Sicherheitsfrage und Antwort fehlen. Da unsere Anwendung derzeit so konfiguriert ist, dass eine Sicherheitsfrage und Antwort erforderlich ist, müssen wir beim programmgesteuerten Erstellen eines der beiden letzten Überladungen verwenden.
Um die Verwendung der CreateUser
Methode zu veranschaulichen, erstellen wir eine Benutzeroberfläche, auf der wir den Benutzer zur Eingabe seines Namens, Kennworts, einer E-Mail 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 aufPassword
- Ein Textfeld mit dem Namen
Email
- Eine Bezeichnung mit
SecurityQuestion
deaktivierterText
Eigenschaft - Ein Textfeld mit dem Namen
SecurityAnswer
- Eine Schaltfläche mit dem Namen
CreateAccountButton
, derenText
Eigenschaft auf "Benutzerkonto erstellen" festgelegt ist - Ein Bezeichnungssteuerelement mit
CreateAccountResults
deaktivierterText
Eigenschaft
An diesem Punkt sollte ihr Bildschirm ähnlich wie der screenshot in Abbildung 6 dargestellt aussehen.
Abbildung 6: Hinzufügen der verschiedenen Websteuerelemente zum CreatingUserAccounts.aspx Page
Bild mit voller Größe (Klicken, um das Bild in voller Größe anzuzeigen)
Die SecurityQuestion
Bezeichnung und SecurityAnswer
das TextBox-Steuerelement 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 es jedem Benutzer möglich ist, seine eigene Sicherheitsfrage zu definieren. Für dieses Beispiel habe ich jedoch beschlossen, eine universelle Sicherheitsfrage zu verwenden, nämlich: Was ist Ihre Lieblingsfarbe?
Um diese vordefinierte Sicherheitsfrage zu implementieren, fügen Sie der CodeBehind-Klasse der Seite eine Konstante hinzu, die sie passwordQuestion
der Sicherheitsfrage zuweist. Weisen Sie dann im Page_Load
Ereignishandler diese Konstante der SecurityQuestion
Bezeichnungseigenschaft 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'
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
des Typs MembershipCreateStatus
. MembershipCreateStatus
ist eine Aufzählung, die den Status des CreateUser
Vorgangs angibt. Wenn das Benutzerkonto beispielsweise erfolgreich erstellt wird, wird die resultierende MembershipCreateStatus
Instanz auf einen Wert Success;
von andererseits festgelegt, wenn der Vorgang fehlschlägt, da bereits ein Benutzer mit demselben Benutzernamen vorhanden ist, wird er auf einen Wert von DuplicateUserName
festgelegt. In der CreateUser
von uns verwendeten Überladung müssen wir eine MembershipCreateStatus
Instanz an die Methode übergeben. Dieser Parameter wird auf den entsprechenden Wert innerhalb der CreateUser
Methode festgelegt, und wir können den Wert nach dem Methodenaufruf untersuchen, um festzustellen, ob das Benutzerkonto erfolgreich erstellt wurde.
Nach dem Aufrufen CreateUser
wird createStatus
eine Select Case
Anweisung verwendet, um eine entsprechende Nachricht abhängig vom zugewiesenen createStatus
Wert auszugeben. Abbildung 7 zeigt die Ausgabe, wenn ein neuer Benutzer erfolgreich erstellt wurde. Abbildung 8 und 9 zeigen die Ausgabe an, wenn das Benutzerkonto nicht erstellt wird. In Abbildung 8 hat der Besucher ein fünfstelliges Kennwort eingegeben, das nicht den anforderungen der 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, um das Bild in voller Größe anzuzeigen)
Abbildung 8: Das Benutzerkonto wird nicht erstellt, da 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, die keinen Parameter vom Typ MembershipCreateStatus
aufweisen. Diese ersten beiden Überladungen lösen eine Ausnahme im Gesicht eines Fehlers aus, die eine StatusCode
Eigenschaft vom Typ MembershipCreateStatus
enthält.MembershipCreateUserException
Überprüfen Sie nach dem Erstellen einiger Benutzerkonten, ob die Konten erstellt wurden, indem Sie den Inhalt der aspnet_Users
Und aspnet_Membership
Tabellen in der SecurityTutorials.mdf
Datenbank auflisten. Wie in Abbildung 10 dargestellt, 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, um das Bild in voller Größe anzuzeigen)
Während der Mitgliedschaftsbenutzerspeicher jetzt Bruce und Titos Kontoinformationen enthält, müssen wir noch Funktionen implementieren, mit denen Bruce oder Tito sich bei der Website anmelden kann. Login.aspx
Überprüft derzeit die Anmeldeinformationen des Benutzers anhand eines hartcodierten Satzes von Benutzernamen-/Kennwortpaaren – es überprüft nicht die bereitgestellten Anmeldeinformationen für das Mitgliedschaftsframework. Nun müssen die neuen Benutzerkonten in den aspnet_Users
Tabellen aspnet_Membership
ausreichen. Im nächsten Lernprogramm zum Überprüfen von Benutzeranmeldeinformationen für den Benutzerspeicher für Mitgliedschaften aktualisieren wir die Anmeldeseite, um die Überprüfung für den Mitgliedschaftsspeicher zu überprüfen.
Hinweis
Wenn keine Benutzer in Ihrer SecurityTutorials.mdf
Datenbank angezeigt werden, liegt dies möglicherweise daran, dass Ihre Webanwendung den Standardmäßigen Mitgliedschaftsanbieter 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 Ordner eine Datenbank mit dem App_Data
Namen ASPNETDB.mdf
hinzugefügt wurde, ist dies das Problem. Kehren Sie zu Schritt 4 des Lernprogramms zum Erstellen des Mitgliedschaftsschemas in SQL Server zurück, um Anweisungen zum ordnungsgemäßen Konfigurieren des Mitgliedschaftsanbieters zu erhalten.
In den meisten Erstellen von Benutzerkontoszenarien wird dem Besucher eine Benutzeroberfläche zur Eingabe seines Benutzernamens, Kennworts, E-Mail und anderer wichtiger Informationen angezeigt, an dem an diesem Punkt ein neues Konto erstellt wird. In diesem Schritt haben wir uns mit der Erstellung einer solchen Benutzeroberfläche von Hand befasst und dann gesehen, wie sie die Membership.CreateUser
Methode zum programmgesteuerten Hinzufügen des neuen Benutzerkontos basierend auf den Eingaben des Benutzers verwendet. Unser Code hat jedoch gerade das neue Benutzerkonto erstellt. Sie hat keine Nachverfolgungsaktionen ausgeführt, z. B. die Anmeldung beim Benutzer auf der Website unter dem gerade erstellten Benutzerkonto oder das Senden einer Bestätigungs-E-Mail an den Benutzer. Diese zusätzlichen Schritte erfordern zusätzlichen Code im Ereignishandler der Schaltfläche Click
.
ASP.NET wird mit dem CreateUserWizard-Steuerelement ausgeliefert, das für die Verarbeitung des Erstellungsprozesses des Benutzerkontos konzipiert ist, vom Rendern einer Benutzeroberfläche zum Erstellen neuer Benutzerkonten bis hin zum Erstellen des Kontos im Mitgliedschaftsframework und Zum Ausführen von Aufgaben nach der Kontoerstellung, z. B. Senden einer Bestätigungs-E-Mail und Protokollierung des gerade erstellten Benutzers bei der Website. Die Verwendung des CreateUserWizard-Steuerelements ist so einfach wie das Ziehen des CreateUserWizard-Steuerelements aus der Toolbox auf eine Seite und das Anschließende Festlegen einiger Eigenschaften. In den meisten Fällen müssen Sie keine einzelne Codezeile schreiben. Wir werden dieses niftige Steuerelement im Detail in Schritt 6 untersuchen.
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 Ihre Anforderungen wahrscheinlich erfüllt. Die CreateUser
Methode ist jedoch praktisch in Szenarien, in denen Sie eine hochgradig angepasste Benutzeroberfläche zum Erstellen eines Kontos benötigen oder wenn Sie programmgesteuert neue Benutzerkonten über eine alternative Benutzeroberfläche erstellen müssen. Beispielsweise verfügen Sie über eine Seite, 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 ein neues Konto für jeden Benutzer, der im XML-Code dargestellt wird, indem die CreateUser
Methode aufgerufen wird.
Schritt 6: Erstellen eines neuen Benutzers mit dem CreateUserWizard-Steuerelement
ASP.NET enthält eine Reihe von Anmeldewebsteuerelementen. Diese Steuerelemente unterstützen viele gängige Benutzerkonten- und Anmeldeszenarien. Das CreateUserWizard-Steuerelement ist ein solches Steuerelement, das entwickelt wurde, um eine Benutzeroberfläche zum Hinzufügen eines neuen Benutzerkontos zum Mitgliedschaftsframework darzustellen.
Wie viele der anderen anmeldebezogenen Websteuerelemente kann createUserWizard verwendet werden, ohne eine einzelne Codezeile zu schreiben. Sie bietet intuitiv eine Benutzeroberfläche basierend auf den Konfigurationseinstellungen des Mitgliedschaftsanbieters und ruft die Methode der Membership
Klasse CreateUser
intern auf, nachdem der Benutzer die erforderlichen Informationen eingegeben und auf die Schaltfläche "Benutzer erstellen" klickt. Das CreateUserWizard-Steuerelement ist extrem 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 von 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 zusätzliche Schritte zur Benutzerregistrierung können hinzugefügt werden.
Beginnen wir mit einem Blick auf die 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 Verhaltens von CreateUserWizard
Kehren Sie zur CreatingUserAccounts.aspx
Seite im Membership
Ordner zurück, wechseln Sie zum Modus "Entwurf" oder "Teilen", und fügen Sie dann oben auf der Seite ein CreateUserWizard-Steuerelement hinzu. Das CreateUserWizard-Steuerelement wird im Abschnitt "Login controls" der Toolbox abgelegt. Legen Sie nach dem Hinzufügen des Steuerelements dessen ID
Eigenschaft auf RegisterUser
. Wie der Screenshot in Abbildung 11 zeigt, rendert createUserWizard eine Benutzeroberfläche mit Textfeldern für den Benutzernamen, das Kennwort, die E-Mail-Adresse und die Sicherheitsfrage und -antwort des neuen Benutzers.
Abbildung 11: Das CreateUserWizard-Steuerelement rendert eine generische Benutzeroberfläche zum Erstellen (Klicken, um das Bild in voller Größe anzuzeigen)
Nehmen wir uns einen Moment Zeit, um die vom CreateUserWizard-Steuerelement generierte Standardbenutzeroberfläche mit der Schnittstelle zu vergleichen, die wir in Schritt 5 erstellt haben. Zunächst ermöglicht das CreateUserWizard-Steuerelement dem Besucher, sowohl die Sicherheitsfrage als auch die Antwort anzugeben, während unsere manuell erstellte Schnittstelle eine vordefinierte Sicherheitsfrage verwendet hat. Die Schnittstelle des CreateUserWizard-Steuerelements enthält auch Überprüfungssteuerelemente, während wir die Validierung für die Formularfelder unserer Schnittstelle noch implementieren mussten. Außerdem enthält die CreateUserWizard-Steuerelementschnittstelle ein Textfeld "Kennwort bestätigen" (zusammen mit einem CompareValidator, um sicherzustellen, dass der eingegebene Text das Kennwort und die Textfelder "Kennwort vergleichen" gleich ist).
Interessant ist, dass das CreateUserWizard-Steuerelement beim Rendern der Benutzeroberfläche die Konfigurationseinstellungen des Mitgliedschaftsanbieters konsultiert. Die Textfelder für Sicherheitsfragen und Antworten werden beispielsweise nur angezeigt, wenn requiresQuestionAndAnswer
sie 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 die zugehörigen ErrorMessage
und ValidationExpression
Eigenschaften basierend auf den minRequiredPasswordLength
Einstellungen , minRequiredNonalphanumericCharacters
und passwordStrengthRegularExpression
Konfigurationseinstellungen fest.
Das CreateUserWizard-Steuerelement wird, wie der Name schon sagt, vom Assistenten-Steuerelement abgeleitet. Assistentensteuerelemente sind so konzipiert, dass sie eine Schnittstelle zum Abschließen von mehrstufigen Aufgaben bereitstellen. Ein Assistentensteuerelement verfügt möglicherweise über eine beliebige Anzahl von WizardSteps
, von denen jede eine Vorlage ist, die die HTML- und Websteuerelemente für diesen Schritt definiert. Das Assistenten-Steuerelement zeigt zunächst das erste WizardStep
zusammen mit Navigationssteuerelementen an, mit denen der Benutzer von einem Schritt zum nächsten fortfahren kann oder zu vorherigen Schritten zurückkehren kann.
Wie das deklarative Markup in Abbildung 11 zeigt, enthält die Standardschnittstelle des CreateUserWizard-Steuerelements zwei WizardStep
Elemente:
CreateUserWizardStep
? rendert die Schnittstelle zum Sammeln von Informationen zum Erstellen des neuen Benutzerkontos. Dies ist der in Abbildung 11 gezeigte Schritt.CompleteWizardStep
? rendert eine Meldung, die angibt, dass das Konto erfolgreich erstellt wurde.
Die Darstellung und das Verhalten von CreateUserWizard können geändert werden, indem Sie eine dieser Schritte in Vorlagen konvertieren oder eigene WizardStep
Elemente hinzufügen. Im Lernprogramm "Zusätzliche Benutzerinformationen speichern" werden wir eine zur 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 Benutzeroberfläche von CreateUserWizard ein. Versuchen Sie, ein Kennwort einzugeben, das nicht den Anforderungen für die Kennwortstärke entspricht, oder lassen Sie das Textfeld "Benutzername" leer. CreateUserWizard zeigt eine entsprechende Fehlermeldung an. Abbildung 12 zeigt die Ausgabe beim Versuch, einen Benutzer mit einem unzureichend sicheren Kennwort zu erstellen.
Abbildung 12: Die CreateUserWizard fügt automatisch Überprüfungssteuerelemente ein (Klicken, um das Bild in voller Größe anzuzeigen)
Geben Sie als Nächstes die entsprechenden Werte in den CreateUserWizard ein, und klicken Sie auf die Schaltfläche "Benutzer erstellen". Wenn die erforderlichen Felder eingegeben wurden und die Stärke des Kennworts ausreicht, erstellt CreateUserWizard über das Mitgliedschaftsframework ein neues Benutzerkonto und zeigt dann die Benutzeroberfläche an CompleteWizardStep
(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, um das Bild in voller Größe anzuzeigen)
Hinweis
Wie in Abbildung 13 dargestellt, enthält die CompleteWizardStep
Schnittstelle eine Schaltfläche "Weiter". An dieser Stelle führt jedoch nur ein Postback durch, sodass der Besucher auf derselben Seite bleibt. Im Abschnitt "Anpassen des Erscheinungsbilds und Verhaltens von CreateUserWizard durch seine Eigenschaften" wird erläutert, wie Sie diese Schaltfläche dem Besucher Default.aspx
senden können (oder auf einer anderen Seite).
Kehren Sie nach dem Erstellen eines neuen Benutzerkontos zu Visual Studio zurück, und überprüfen Sie die aspnet_Users
Tabellen aspnet_Membership
wie in Abbildung 10, um zu überprüfen, ob das Konto erfolgreich erstellt wurde.
Anpassen des Verhaltens und der Darstellung von CreateUserWizard durch seine Eigenschaften
CreateUserWizard kann auf unterschiedliche Weise durch Eigenschaften, WizardStep
S und Ereignishandler angepasst werden. In diesem Abschnitt wird erläutert, wie sie die Darstellung des Steuerelements durch seine Eigenschaften anpassen können. Im nächsten Abschnitt wird das Verhalten des Steuerelements durch Ereignishandler erweitert.
Nahezu der gesamte Text, der in der Standardbenutzeroberfläche des CreateUserWizard-Steuerelements angezeigt wird, kann über seine Vielzahl von Eigenschaften angepasst werden. Beispielsweise können links neben den Textfelder die Beschriftungen "Benutzername", "Kennwort bestätigen", "Kennwort bestätigen", "E-Mail", "Sicherheitsfrage" und "Sicherheitsantwort" angepasst EmailLabelText
ConfirmPasswordLabelText
PasswordLabelText
UserNameLabelText
QuestionLabelText
werden.AnswerLabelText
Ebenso gibt es Eigenschaften zum Angeben des Texts für die Schaltflächen "Benutzer erstellen" und "Weiter" in den CreateUserWizardStep
und CompleteWizardStep
und , sowie wenn 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 Formateigenschaften konfiguriert werden. Das CreateUserWizard-Steuerelement selbst verfügt über die allgemeinen Eigenschaften des Websteuerelementstils - BackColor
, , BorderStyle
CssClass
Font
, , usw. - und es gibt eine Reihe von Formateigenschaften zum Definieren der Darstellung für bestimmte Abschnitte der CreateUserWizard-Schnittstelle. Die TextBoxStyle
Eigenschaft definiert beispielsweise die Formatvorlagen für die Textfelder im CreateUserWizardStep
, während die TitleTextStyle
Eigenschaft die Formatvorlage für den Titel definiert ( Registrieren 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, wird neben der Schaltfläche "Benutzer erstellen" eine Schaltfläche "Abbrechen" angezeigt (der Standardwert ist "False"). Wenn Sie die Schaltfläche "Abbrechen" anzeigen, müssen Sie auch die CancelDestinationPageUrl
Eigenschaft festlegen, an die der Benutzer nach dem Klicken auf "Abbrechen" gesendet wird. Wie im vorherigen Abschnitt erwähnt, bewirkt die Schaltfläche "Weiter" in der CompleteWizardStep
Benutzeroberfläche einen Postback, lässt den Besucher aber auf derselben Seite. Wenn Sie den Besucher nach dem Klicken auf die Schaltfläche "Weiter" an eine andere Seite senden möchten, 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 "Weiter" geklickt wird. Legen Sie dazu die DisplayCancelButton
Eigenschaft auf True und die CancelDestinationPageUrl
ContinueDestinationPageUrl
Eigenschaften auf ~/Default.aspx fest. Abbildung 14 zeigt die aktualisierte CreateUserWizard-Datei, wenn sie über einen Browser angezeigt wird.
Abbildung 14: Die CreateUserWizardStep
Schaltfläche "Abbrechen" enthält (Klicken Sie, um das Bild in voller Größe anzuzeigen)
Wenn ein Besucher einen Benutzernamen, ein Kennwort, eine E-Mail-Adresse und eine Sicherheitsfrage eingibt und auf "Benutzer erstellen" klickt, wird ein neues Benutzerkonto erstellt, und der Besucher wird als dieser neu erstellte Benutzer angemeldet. Wenn 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 erlauben, neue Benutzerkonten hinzuzufügen. Dadurch würde das Benutzerkonto erstellt, aber der Administrator bleibt als Administrator angemeldet (und nicht als neu erstelltes Konto). Dieses Verhalten kann über die boolesche LoginCreatedUser
Eigenschaft geändert werden.
Benutzerkonten im Mitgliedschaftsframework enthalten eine genehmigte Kennzeichnung; Benutzer, die nicht genehmigt wurden, können sich nicht bei der Website anmelden. Standardmäßig wird ein neu erstelltes Konto als genehmigt markiert, sodass sich der Benutzer sofort bei der Website anmelden kann. Es ist jedoch möglich, neue Benutzerkonten als nicht genehmigt gekennzeichnet zu haben. Vielleicht möchten Sie, dass ein Administrator neue Benutzer manuell genehmigt, bevor er sich anmelden kann; oder vielleicht möchten Sie überprüfen, ob die bei der Registrierung eingegebene E-Mail-Adresse gültig ist, bevor ein Benutzer sich anmelden darf. Wie auch immer der Fall sein kann, können Sie das neu erstellte Benutzerkonto als nicht genehmigt gekennzeichnet haben, indem Sie die Eigenschaft des CreateUserWizard-Steuerelements DisableCreatedUser
auf "True" festlegen (der Standardwert ist "False").
Andere verhaltensbezogene Eigenschaften der Notiz enthalten AutoGeneratePassword
und MailDefinition
. Wenn die AutoGeneratePassword
Eigenschaft auf "True" festgelegt ist, werden das CreateUserWizardStep
Textfeld "Kennwort" und "Kennwort bestätigen" nicht angezeigt. Stattdessen wird das kennwort des neu erstellten Benutzers automatisch mithilfe der Methode der Membership
Klasse GeneratePassword
generiert. Die GeneratePassword
Methode erstellt ein Kennwort einer angegebenen Länge und mit 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 konstruierte E-Mail-Nachricht. Diese Untereigenschaften enthalten Optionen wie , , Priority
, , IsBodyHtml
, From
, und CC
BodyFileName
.Subject
Die BodyFileName
Eigenschaft verweist auf eine Text- oder HTML-Datei, die den Textkörper für die E-Mail-Nachricht enthält. Der Textkörper unterstützt zwei vordefinierte Platzhalter: <%UserName%>
und <%Password%>
. Diese Platzhalter, sofern sie in der BodyFileName
Datei vorhanden sind, werden durch den Namen und das Kennwort des gerade erstellten Benutzers ersetzt.
Hinweis
Die CreateUserWizard
Eigenschaft des Steuerelements MailDefinition
gibt nur Details zu der E-Mail-Nachricht an, die gesendet wird, wenn ein neues Konto erstellt wird. Es enthält keine Details dazu, wie die E-Mail-Nachricht tatsächlich gesendet wird (d. r., ob ein SMTP-Server oder ein E-Mail-Drop-Verzeichnis verwendet wird, alle Authentifizierungsinformationen usw.). Diese Details auf niedriger Ebene müssen im <system.net>
Abschnitt in Web.config
. 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 zu SystemNetMail.com und meinem Artikel zum Senden von E-Mails 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. Wenn ein Besucher beispielsweise seinen Benutzernamen, sein Kennwort und andere relevante Informationen eingibt und auf die Schaltfläche "Benutzer erstellen" klickt, löst das CreateUserWizard-Steuerelement sein CreatingUser
Ereignis aus. 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 verwendeten Steuerelemente.
In bestimmten Szenarien möchten wir möglicherweise auf den CreateUserWizard-Workflow tippen, den wir ausführen können, indem wir einen Ereignishandler für das entsprechende Ereignis erstellen. Um dies zu veranschaulichen, verbessern wir das RegisterUser
CreateUserWizard-Steuerelement, um eine benutzerdefinierte Überprüfung für den Benutzernamen und das Kennwort einzuschließen. Insbesondere verbessern wir unsere CreateUserWizard so, dass Benutzernamen keine führenden oder nachgestellten Leerzeichen enthalten können und der Benutzername nicht an einer beliebigen Stelle im Kennwort angezeigt werden kann. Kurz gesagt möchten wir verhindern, dass jemand einen Benutzernamen wie "Scott" oder eine Kombination aus Benutzername und Kennwort wie Scott und Scott.1234 erstellt.
Dazu erstellen wir einen Ereignishandler für das CreatingUser
Ereignis, um unsere zusätzlichen Überprüfungen durchzuführen. Wenn die bereitgestellten Daten ungültig sind, müssen wir den Erstellungsprozess abbrechen. Außerdem müssen wir der Seite ein Bezeichnungswebsteuerelement hinzufügen, um eine Meldung anzuzeigen, in der erläutert wird, dass der Benutzername oder das Kennwort ungültig ist. Fügen Sie zunächst ein Bezeichnungssteuerelement unterhalb des CreateUserWizard-Steuerelements hinzu, und legen Sie dessen ID
Eigenschaft auf InvalidUserNameOrPasswordMessage
und deren ForeColor
Eigenschaft fest.Red
Löschen Sie die Text
Eigenschaft, und Visible
legen Sie deren EnableViewState
Eigenschaften 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 CreateUserWizard-Steuerelements CreatingUser
. 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 in das CreateUserWizard-Steuerelement eingegebene Benutzername und das Kennwort über die zugehörigen UserName
Eigenschaften bzw Password
. Eigenschaften 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 im Kennwort gefunden wird. Wenn eine dieser Bedingungen erfüllt ist, wird in der InvalidUserNameOrPasswordMessage
Bezeichnung eine Fehlermeldung angezeigt, und die Eigenschaft des Ereignishandlers e.Cancel
ist auf <e.Cancel
dieser Wert auf True
"CreateUserWizard" festgelegt ist, wird der Workflow effektiv abgebrochen und der Erstellungsprozess des Benutzerkontos aufgehoben.
Abbildung 15 zeigt einen Screenshot, CreatingUserAccounts.aspx
wenn der Benutzer einen Benutzernamen mit führenden Leerzeichen eingibt.
Abbildung 15: Benutzernamen mit führenden oder nachgestellten Leerzeichen sind nicht zulässig (Zum Anzeigen des Bilds mit voller Größe klicken)
Hinweis
Wir sehen ein Beispiel für die Verwendung des CreateUserWizard-Steuerelementereignisses CreatedUser
im Lernprogramm zum Speichern zusätzlicher Benutzerinformationen.
Zusammenfassung
Die Methode der Membership
CreateUser
Klasse erstellt ein neues Benutzerkonto im Mitgliedschaftsframework. Dies geschieht durch Delegieren des Aufrufs an den konfigurierten Mitgliedschaftsanbieter. Im Fall der SqlMembershipProvider
Methode CreateUser
wird den aspnet_Users
Tabellen und aspnet_Membership
Datenbanktabellen ein Datensatz hinzugefügt.
Während neue Benutzerkonten programmgesteuert erstellt werden können (wie wir in Schritt 5 gesehen haben), besteht ein schnellerer und einfacherer Ansatz darin, das CreateUserWizard-Steuerelement zu verwenden. Dieses Steuerelement rendert eine mehrstufige Benutzeroberfläche zum Sammeln von Benutzerinformationen und zum Erstellen eines neuen Benutzers im Mitgliedschaftsframework. Unter den Deckeln verwendet dieses Steuerelement dieselbe Membership.CreateUser
Methode wie in Schritt 5 untersucht, aber das Steuerelement erstellt die Benutzeroberfläche, Überprüfungssteuerelemente und reagiert auf Fehler bei der Erstellung von Benutzerkonten, ohne eine Codelecken schreiben zu müssen.
An diesem Punkt haben wir die Funktionalität zum Erstellen neuer Benutzerkonten. Die Anmeldeseite überprüft jedoch weiterhin anhand dieser hartcodierten Anmeldeinformationen, die wir im zweiten Lernprogramm angegeben haben. Im nächsten Lernprogramm aktualisieren Login.aspx
wir, um die vom Benutzer bereitgestellten Anmeldeinformationen für das Mitgliedschaftsframework zu überprüfen.
Glückliche Programmierung!
Weitere nützliche Informationen
Weitere Informationen zu den in diesem Lernprogramm erläuterten Themen finden Sie in den folgenden Ressourcen:
CreateUser
Technische Unterlagen- CreateUserWizard-Steuerelement ( Übersicht)
- Erstellen eines dateisystembasierten Websitezuordnungsanbieters
- 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 Provider, 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 Web Technologies zusammen. Scott arbeitet als unabhängiger Berater, Trainer und Schriftsteller. Sein neuestes Buch ist Sams Teach Yourself ASP.NET 2.0 in 24 Stunden. Scott kann über seinen Blog unter mitchell@4guysfromrolla.com oder über seinen Blog erreicht http://ScottOnWriting.NETwerden.
Besonderer Dank an
Diese Lernprogrammreihe wurde von vielen hilfreichen Prüfern überprüft. Leitender Prüfer für dieses Lernprogramm war Teresa Murphy. Möchten Sie meine bevorstehenden MSDN-Artikel überprüfen? Wenn dies der Fall ist, legen Sie mir eine Zeile bei mitchell@4GuysFromRolla.com.