Freigeben über


Hinzufügen von Benutzerkonten (C#)

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 "Formularauthentifizierung " erstellt und dann im Lernprogramm "Formularauthentifizierungskonfiguration" und "Erweiterte Themen " erweitert 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:

  1. Aktivieren der formularbasierten Authentifizierung. Wie in einer Übersicht über die Formularauthentifizierung erläutert, wird die Formularauthentifizierung durch Bearbeiten Web.config und Festlegen des <authentication> Elementattributs mode aktiviert.Forms Bei aktivierter Formularauthentifizierung wird jede eingehende Anforderung auf ein Formularauthentifizierungsticket untersucht, das den Anforderer identifiziert, falls vorhanden.
  2. 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 des aspnet_regsql.exe Tools, um dies zu erreichen.
  3. 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 des LocalSqlServer 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.

Dem Mitgliedschaftsordner wurden fünf neue Seiten hinzugefügt.

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 Navigationsoberfläche der Website anzeigen lassen.

Diese beiden Aufgaben – die Definition der Websitekarte und die Implementierung 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.

Hinzufügen einer Datei namens

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.

Die Websiteübersicht stellt eine hierarchische Navigationsstruktur dar.

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.

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: Menü wird hier gehen..." 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="<%#
                         ((SiteMapNode) Container.DataItem).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.sitemapder 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 "Start" 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" .

Die Navigationsoberfläche wird mithilfe geschachtelter nicht angeordneter Listen gerendert.

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.

Das Breadcrumb zeigt die aktuelle Seite und deren Vorgänger in der Websitekarte an.

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.

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:

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, dessen TextMode Eigenschaft auf Password
  • Ein Textfeld mit dem Namen Email
  • Eine Bezeichnung mit SecurityQuestion deaktivierter Text Eigenschaft
  • Ein Textfeld mit dem Namen SecurityAnswer
  • Eine Schaltfläche mit dem Namen CreateAccountButton , deren Texteigenschaft auf "Benutzerkonto erstellen" festgelegt ist
  • Ein Bezeichnungssteuerelement mit CreateAccountResults deaktivierter Text Eigenschaft

An diesem Punkt sollte ihr Bildschirm ähnlich wie der screenshot in Abbildung 6 dargestellt aussehen.

Hinzufügen der verschiedenen Websteuerelemente zur CreatingUserAccounts.aspx Seite

Abbildung 6: Hinzufügen der verschiedenen Websteuerelemente zur CreatingUserAccounts.aspx Seite (Klicken Sie hier, 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 mich jedoch entschieden, 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 passwordQuestionder Sicherheitsfrage zuweist. Weisen Sie dann im Page_Load Ereignishandler diese Konstante der SecurityQuestion Bezeichnungseigenschaft Text zu:

const string passwordQuestion = "What is your favorite color";
    
protected void Page_Load(object sender, EventArgs e)
{
     if (!Page.IsPostBack)
          SecurityQuestion.Text = passwordQuestion;
}

Erstellen Sie als Nächstes einen Ereignishandler für das CreateAccountButtonEreignis's Click , und fügen Sie den folgenden Code hinzu:

protected void CreateAccountButton_Click(object sender, EventArgs e)
{
     MembershipCreateStatus createStatus;
     MembershipUser newUser = Membership.CreateUser(Username.Text, Password.Text, Email.Text, passwordQuestion, SecurityAnswer.Text, true, out createStatus);
     switch (createStatus)
     {
          case MembershipCreateStatus.Success:
               CreateAccountResults.Text = "The user account was successfully created!";
               break;
          case MembershipCreateStatus.DuplicateUserName:
               CreateAccountResults.Text = "There already exists a user with this username.";
               break;

          case MembershipCreateStatus.DuplicateEmail:
               CreateAccountResults.Text = "There already exists a user with this email address.";
               break;
          case MembershipCreateStatus.InvalidEmail:
               CreateAccountResults.Text = "There email address you provided in invalid.";
               break;
          case MembershipCreateStatus.InvalidAnswer:
               CreateAccountResults.Text = "There security answer was invalid.";
               break;
          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.";

               break;
          default:
               CreateAccountResults.Text = "There was an unknown error; the user account was NOT created.";
               break;
     }
}

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 beispielsweise das Benutzerkonto erfolgreich erstellt wird, wird die resultierende MembershipCreateStatus Instanz auf einen Wert von Success; auf der anderen Seite festgelegt, wenn der Vorgang fehlschlägt, da bereits ein Benutzer mit demselben Benutzernamen vorhanden ist, wird sie auf einen Wert von DuplicateUserNamefestgelegt. In der CreateUser von uns verwendeten Überladung müssen wir eine MembershipCreateStatus Instanz als out Parameter 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 CreateUserwird createStatuseine switch Anweisung verwendet, um eine entsprechende Nachricht abhängig vom zugewiesenen createStatusWert 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.

Ein neues Benutzerkonto wurde erfolgreich erstellt.

Abbildung 7: Ein neues Benutzerkonto wurde erfolgreich erstellt (Klicken Sie, um das Bild in voller Größe anzuzeigen)

Das Benutzerkonto wird nicht erstellt, da das angegebene Kennwort zu schwach ist.

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)

Das Benutzerkonto wird nicht erstellt, da der Benutzername bereits verwendet wird.

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 MembershipCreateStatusaufweisen. Diese ersten beiden Überladungen lösen eine Ausnahme im Gesicht eines Fehlers aus, die eine StatusCode Eigenschaft vom Typ MembershipCreateStatusenthä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.

Es gibt zwei Benutzer im Mitgliedschaftsbenutzerspeicher: 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 einer hartcodierten Gruppe 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, AspNetSqlMembershipProviderder 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 stellt intuitiv eine Benutzeroberfläche basierend auf den Konfigurationseinstellungen des Mitgliedschaftsanbieters bereit und ruft die Methode der Membership Klasse CreateUser intern auf, nachdem der Benutzer die erforderlichen Informationen eingibt 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; Falls erforderlich, kann das Steuerelement in eine Vorlage konvertiert werden, oder zusätzliche Benutzerregistrierung "Schritte" 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.

Das CreateUserWizard-Steuerelement rendert eine generische Benutzeroberfläche zum Erstellen

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. Und die CreateUserWizard-Steuerelementschnittstelle enthält ein Textfeld "Kennwort bestätigen" (zusammen mit einem CompareValidator, um sicherzustellen, dass der Text in die Textfelder "Kennwort vergleichen" und "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 minRequiredPasswordLengthEinstellungen , minRequiredNonalphanumericCharactersund 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 WizardStepzusammen 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 WizardSteps:

  • CreateUserWizardStep – rendert die Schnittstelle, um Informationen zum Erstellen des neuen Benutzerkontos zu sammeln. 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 WizardStepshinzufü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.

Die CreateUserWizard fügt Automatisch Überprüfungssteuerelemente ein.

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.

Ein neues Benutzerkonto wurde erfolgreich erstellt.

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 CompleteWizardStepSchnittstelle eine Schaltfläche "Weiter". An dieser Stelle führt jedoch nur ein Postback durch, sodass der Besucher auf derselben Seite bleibt. Im Abschnitt "Customizing the CreateUserWizard's Appearance and Behavior Through Its Properties" 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, über Eigenschaften WizardStepsund 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. So können beispielsweise die Bezeichnungen "Benutzername", "Kennwort", "Kennwort bestätigen", "E-Mail", "Sicherheitsfrage" und "Sicherheitsantwort" links neben den Textfelder durch die UserNameLabelTextBeschriftungen , PasswordLabelText, , QuestionLabelTextConfirmPasswordLabelTextEmailLabelText, und AnswerLabelText Eigenschaften angepasst werden. Ebenso gibt es Eigenschaften zum Angeben des Texts für die Schaltflächen "Benutzer erstellen" und "Weiter" in den CreateUserWizardStep und und CompleteWizardStep, 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, , BorderStyleCssClassFont, usw. – und es gibt eine Reihe von Formateigenschaften zum Definieren der Darstellung für bestimmte Abschnitte der CreateUserWizard-Schnittstelle. Die TextBoxStyle Eigenschaft definiert z. B. die Formatvorlagen für die Textfelder im Textfeld, CreateUserWizardStepwährend die TitleTextStyle Eigenschaft die Formatvorlage für den Titel definiert ("Für Ihr neues Konto registrieren").

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 CompleteWizardStepBenutzeroberflä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 "CancelDestinationPageUrlContinueDestinationPageUrl~/Default.aspx" fest. Abbildung 14 zeigt die aktualisierte CreateUserWizard-Datei, wenn sie über einen Browser angezeigt wird.

Der CreateUserWizardStep enthält eine Schaltfläche

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 die CreateUserWizardStep Textfelder "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 CCBodyFileName.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 void RegisterUser_CreatingUser(object sender, LoginCancelEventArgs e)
{
     string trimmedUserName = RegisterUser.UserName.Trim();
     if (RegisterUser.UserName.Length != trimmedUserName.Length)
     {
          // 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)
          {
               // 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;
          }
     }
}

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 <a0/> festgelegt. Wenn 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.

Benutzernamen mit führenden oder nachgestellten Leerzeichen sind nicht zulässig.

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 SqlMembershipProviderMethode 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:

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.