Implementieren eines Mitgliedschaftsanbieters

Aktualisiert: November 2007

Die ASP.NET-Mitgliedschaft wurde so konzipiert, dass Sie auf einfache Weise verschiedene Mitgliedschaftsanbieter für Ihre ASP.NET-Anwendungen verwenden können. Sie können die vorhandenen Mitgliedschaftsanbieter von .NET Framework verwenden oder eigene Anbieter implementieren.

Es gibt zwei Hauptgründe dafür, einen benutzerdefinierten Mitgliedschaftsanbieter zu erstellen.

  • Sie müssen Mitgliedschaftsinformationen in einer Datenquelle speichern, die nicht von den vorhandenen Mitgliedschaftsanbietern von NET Framework unterstützt wird, z. B.einer FoxPro-Datenbank, einer Oracle-Datenbank oder einer anderen Datenquelle.

  • Sie müssen Mitgliedschaftsinformationen mit einem Datenbankschema verwalten, das vom Datenbankschema der Anbieter abweicht, die mit .NET Framework geliefert werden. Ein typisches Beispiel dafür sind Mitgliedschaftsdaten, die bereits in der SQL Server-Datenbank für ein Unternehmen oder eine Website vorliegen.

Zum Implementieren eines Mitgliedschaftsanbieters erstellen Sie eine Klasse, die von der abstrakten Klasse MembershipProvider aus dem System.Web.Security-Namespace erbt. Die abstrakte Klasse MembershipProvider erbt von der abstrakten Klasse ProviderBase aus dem System.Configuration.Provider-Namespace. Folglich müssen Sie auch die erforderlichen Member der ProviderBase-Klasse implementieren. In den folgenden Tabellen werden die erforderlichen Eigenschaften und Methoden aufgeführt, die Sie aus der abstrakten Klasse ProviderBase und aus der abstrakten Klasse MembershipProvider implementieren müssen. Außerdem finden Sie eine Beschreibung der beiden abstrakten Klassen. Eine Implementierung der einzelnen Member finden Sie im Code zu Beispiel für eine Mitgliedschaftsanbieterimplementierung.

Member

Beschreibung

Initialize-Methode

Als Eingabe wird der Name des Anbieters und eine NameValueCollection der Konfigurationseinstellungen verwendet. Wird verwendet, um Eigenschaftenwerte für die Anbieterinstanz festzulegen. Dazu gehören implementierungsspezifische Werte und Optionen, die in der Konfigurationsdatei (Machine.config oder Web.config) angegeben sind. Die Konfigurationsdatei ist Teil der Konfiguration.

Erforderliche MembershipProvider-Member

Member

Beschreibung

EnablePasswordReset-Eigenschaft

Ein in der Konfigurationsdatei (Web.config) angegebener Boolean-Wert.

Die EnablePasswordReset-Eigenschaft gibt an, ob Benutzer die ResetPassword-Methode verwenden können, um ihr aktuelles Kennwort mit einem neuen, zufällig generierten Kennwort zu überschreiben.

Diese Eigenschaft ist schreibgeschützt.

EnablePasswordRetrieval-Eigenschaft

Ein in der Konfigurationsdatei (Web.config) angegebener Boolean-Wert.

Die EnablePasswordRetrieval-Eigenschaft zeigt an, ob Benutzer ihr Kennwort mit der GetPassword-Methode abrufen können.

Diese Eigenschaft ist schreibgeschützt.

RequiresQuestionAndAnswer-Eigenschaft

Ein in der Konfigurationsdatei (Web.config) angegebener Boolean-Wert.

Die RequiresQuestionAndAnswer-Eigenschaft zeigt an, ob Benutzer eine Kennwortantwort angeben müssen, um ihr Kennwort mit der GetPassword-Methode abzurufen oder mit der ResetPassword-Methode zurückzusetzen.

Diese Eigenschaft ist schreibgeschützt.

RequiresUniqueEmail-Eigenschaft

Ein in der Konfigurationsdatei (Web.config) angegebener Boolean-Wert.

Die RequiresUniqueEmail-Eigenschaft zeigt an, ob Benutzer bei der Erstellung eines neuen Benutzerkontos eine eindeutige E-Mail-Adresse angeben müssen. Wenn der Benutzer in der Datenquelle für den aktuellen ApplicationName bereits vorhanden ist, gibt die CreateUser-Methode null (Nothing in Visual Basic) und den Statuswert DuplicateEmail zurück.

Diese Eigenschaft ist schreibgeschützt.

PasswordFormat-Eigenschaft

Ein in der Konfigurationsdatei (Web.config) angegebener MembershipPasswordFormat-Wert.

Die PasswordFormat-Eigenschaft gibt das Format an, in dem Kennwörter gespeichert werden. Kennwörter können in den Kennwortformaten Clear, Encrypted und Hashed gespeichert werden. Clear-Kennwörter werden als Nur-Text gespeichert, wodurch die Leistung beim Speichern und Lesen der Kennwörter verbessert wird. Allerdings ist dieses Verfahren weniger sicher, da die Kennwörter beim unbefugten Zugriff auf die Datenquelle einfach gelesen werden können. Encrypted-Kennwörter werden beim Speichern verschlüsselt und beim Abgleich und Abruf des Kennworts entschlüsselt. Dies erfordert eine zusätzliche Verarbeitung für Kennwortspeicherung und -abruf, bietet jedoch mehr Sicherheit, da Kennwörter bei unbefugtem Zugriff auf die Datenquelle nicht problemlos ermittelt werden können. Hashed-Kennwörter werden mit einem unidirektionalen Hashalgorithmus und einem nach Zufallsprinzip generierten Saltwert gehasht, wenn sie in der Datenbank gespeichert werden. Zur Überprüfung wird das Kennwort mit dem in der Datenbank gespeicherten Saltwert gehasht. Gehashte Kennwörter können nicht abgerufen werden.

Zum Verschlüsseln und Entschlüsseln der Kennwortwerte können Sie die virtuelle Methode EncryptPassword und die virtuelle Methode DecryptPassword der MembershipProvider-Klasse verwenden oder Ihren eigenen Verschlüsselungscode angeben. Bei Verwendung der virtuellen Methode EncryptPassword und der virtuellen Methode DecryptPassword der MembershipProvider-Klasse werden Encrypted-Kennwörter anhand der Schlüsselinformation im machineKey-Element (ASP.NET-Einstellungsschema) Ihrer Konfiguration verschlüsselt.

Diese Eigenschaft ist schreibgeschützt.

MaxInvalidPasswordAttempts-Eigenschaft

Ein in der Konfigurationsdatei (Web.config) angegebener Integer-Wert.

Die MaxInvalidPasswordAttempts-Eigenschaft schützt zusammen mit der PasswordAttemptWindow-Eigenschaft davor, dass eine unerwünschte Quelle das Kennwort oder die Kennwortantwort eines Mitgliedschaftsbenutzers durch wiederholte Versuche errät. Wenn die Anzahl der ungültigen Kennwörter oder ungültigen Kennwortantworten für einen Mitgliedschaftsbenutzer die MaxInvalidPasswordAttempts innerhalb der durch PasswordAttemptWindow ausgewiesenen Minuten übersteigt, wird der Mitgliedschaftsbenutzer durch Festlegen der IsLockedOut-Eigenschaft auf true gesperrt, bis die Sperre mithilfe der UnlockUser-Methode aufgehoben wird. Wenn vor Erreichen von MaxInvalidPasswordAttempts ein gültiges Kennwort bzw. eine gültige Kennwortantwort angegeben wird, wird der Zähler mit der Anzahl der ungültigen Versuche auf null zurückgesetzt.

Wenn die RequiresQuestionAndAnswer-Eigenschaft auf false festgelegt wird, werden ungültige Kennwortantwortversuche nicht verfolgt.

Ungültige Kennwörter und Kennwortantworten werden in den Methoden ValidateUser, ChangePassword, ChangePasswordQuestionAndAnswer, GetPassword und ResetPassword verfolgt.

Diese Eigenschaft ist schreibgeschützt.

PasswordAttemptWindow-Eigenschaft

Ein in der Konfigurationsdatei (Web.config) angegebener Integer-Wert.

Eine Beschreibung finden Sie in der Beschreibung der MaxInvalidPasswordAttempts-Eigenschaft.

Diese Eigenschaft ist schreibgeschützt.

ApplicationName-Eigenschaft

Der Name der Anwendung, die die in der Konfigurationsdatei (Web.config) angegebenen Mitgliedschaftsinformationen verwendet. Der ApplicationName wird mit den entsprechenden Benutzerinformationen in der Datenquelle gespeichert und bei der Abfrage dieser Informationen verwendet. Weitere Informationen finden Sie im Abschnitt über ApplicationName weiter unten in diesem Thema.

Diese Eigenschaft ist für Lese- und Schreibzugriff verfügbar und entspricht standardmäßig dem ApplicationPath, falls nicht explizit anders angegeben.

CreateUser-Methode

Verwendet den Namen eines neuen Benutzers, ein Kennwort und eine E-Mail-Adresse als Eingabe und fügt einen neuen Benutzer für die Anwendung in der Datenquelle hinzu. Die CreateUser-Methode gibt ein MembershipUser-Objekt mit den Informationen des neu angelegten Benutzers zurück. Die CreateUser-Methode definiert auch einen out-Parameter (in Visual Basic können Sie ByRef verwenden), der einen MembershipCreateStatus-Wert zurückgibt. Dieser zeigt an, ob der Benutzer erfolgreich angelegt wurde, oder gibt einen Grund an, weshalb der Benutzer nicht erstellt werden konnte.

Die CreateUser-Methode löst das ValidatingPassword-Ereignis aus, wenn ein MembershipValidatePasswordEventHandler angegeben wurde. Abhängig vom Ergebnis des Ereignisses wird der Vorgang zum Anlegen des Benutzers fortgesetzt oder abgebrochen. Sie können die virtuelle Methode OnValidatingPassword verwenden, um den angegebenen MembershipValidatePasswordEventHandler auszuführen.

UpdateUser-Methode

Verwendet ein MembershipUser-Objekt mit den Benutzerinformationen als Eingabe und aktualisiert die Datenquelle mit den angegebenen Werten.

DeleteUser-Methode

Verwendet einen Benutzernamen als Eingabe und löscht die Informationen zu diesem Benutzer aus der Datenquelle. Die DeleteUser-Methode gibt true zurück, wenn der Benutzer erfolgreich gelöscht wurde. Ansonsten wird false zurückgegeben. Ein zusätzlicher Boolean-Parameter gibt an, ob weitere benutzerbezogene Daten wie Rollen- oder Profilinformationen ebenfalls gelöscht werden sollen.

ValidateUser-Methode

Verwendet einen Benutzernamen und ein Kennwort als Eingabe und überprüft, ob die Werte mit denen in der Datenquelle übereinstimmen. Bei Übereinstimmung gibt die ValidateUser-Methode true zurück, ansonsten false.

GetUser-Methode

Verwendet eine eindeutige Benutzer-ID und einen Boolean-Wert als Eingabe, der angibt, ob der LastActivityDate-Wert des Benutzers aktualisiert werden soll. Falls ja, wird dadurch angezeigt, dass der Benutzer gerade online ist. Die GetUser-Methode gibt ein MembershipUser-Objekt mit den aktuellen Werten für den angegebenen Benutzer aus der Datenquelle zurück. Wenn der Benutzername nicht in der Datenquelle gefunden wird, gibt die GetUser-Methode null (Nothing in Visual Basic) zurück.

GetUser-Methode

Verwendet einen Benutzernamen und einen Boolean-Wert als Eingabe, der angibt, ob der LastActivityDate-Wert des Benutzers aktualisiert werden soll. Falls ja, wird dadurch angezeigt, dass der Benutzer gerade online ist. Die GetUser-Methode gibt ein MembershipUser-Objekt mit den aktuellen Werten aus der Datenquelle für den angegebenen Benutzer zurück. Wenn der Benutzername nicht in der Datenquelle gefunden wird, gibt die GetUser-Methode null (Nothing in Visual Basic) zurück.

GetAllUsers-Methode

Gibt eine MembershipUserCollection mit den MembershipUser-Objekten für alle Benutzer in der Datenquelle zurück.

Die von GetAllUsers zurückgegebenen Ergebnisse werden vom pageIndex-Parameter und vom pageSize-Parameter eingeschränkt. Der pageSize-Parameter bezeichnet die maximale Anzahl von MembershipUser-Objekten, die in der MembershipUserCollection zurückgegeben werden sollen. Der pageIndex-Parameter gibt an, welche Ergebnisseite zurückgegeben wird, wobei 1 für die erste Seite steht. Der totalRecords-Parameter ist ein out-Parameter, der auf die Gesamtzahl der Mitgliedschaftsbenutzer festgelegt wird. Wenn beispielsweise die Datenbank für die Anwendung 13 Benutzer enthält und pageIndex den Wert 2 und pageSize den Wert 5 hat, enthält die zurückgegebene MembershipUserCollection den sechsten bis einschließlich den zehnten zurückgegebenen Benutzer. totalRecords wird dann auf 13 festgelegt.

GetNumberOfUsersOnline-Methode

Gibt einen ganzzahligen Wert mit der Anzahl der Benutzer in der Datenquelle zurück, bei denen LastActivityDate größer als das aktuelle Datum minus der UserIsOnlineTimeWindow-Eigenschaft ist. Die UserIsOnlineTimeWindow-Eigenschaft ist ein ganzzahliger Wert, der die Anzahl der Minuten angibt, anhand derer bestimmt wird, ob ein Benutzer online ist.

ResetPassword-Methode

Verwendet einen Benutzernamen und eine Kennwortantwort als Eingabe und generiert ein neues, zufälliges Kennwort für den angegebenen Benutzer. Die ResetPassword-Methode aktualisiert die Benutzerinformationen in der Datenquelle mit dem neuen Kennwortwert und gibt das neue Kennwort als string zurück. Eine bequeme Möglichkeit, ein zufälliges Kennwort zu generieren, ist die GeneratePassword-Methode der Membership-Klasse.

Die ResetPassword-Methode stellt sicher, dass die EnablePasswordReset-Eigenschaft vor dem Ausführen einer Aktion auf true festgelegt wird. Wenn die EnablePasswordReset-Eigenschaft den Wert false hat, wird eine NotSupportedException ausgelöst. Die ResetPassword-Methode überprüft auch den Wert der RequiresQuestionAndAnswer-Eigenschaft. Wenn die RequiresQuestionAndAnswer-Eigenschaft den Wert true hat, überprüft die ResetPassword-Methode den Wert des angegebenen Antwortparameters anhand der gespeicherten Kennwortantwort in der Datenquelle. Wenn es keine Übereinstimmung gibt, wird eine MembershipPasswordException ausgelöst.

Die ResetPassword-Methode löst zur Validierung des neu generierten Kennworts das ValidatingPassword-Ereignis aus, wenn ein MembershipValidatePasswordEventHandler angegeben wurde. Abhängig vom Ergebnis des Ereignisses wird das Kennwort zurückgesetzt oder der Vorgang abgebrochen. Sie können die virtuelle Methode OnValidatingPassword verwenden, um den angegebenen MembershipValidatePasswordEventHandler auszuführen.

GetPassword-Methode

Verwendet einen Benutzernamen und eine Kennwortantwort als Eingabe und ruft das Kennwort für diesen Benutzer aus der Datenquelle ab. Anschließend wird das Kennwort als string zurückgegeben.

GetPassword stellt sicher, dass die EnablePasswordRetrieval-Eigenschaft vor dem Ausführen einer Aktion auf true festgelegt wird. Wenn die EnablePasswordRetrieval-Eigenschaft den Wert false hat, wird eine ProviderException ausgelöst.

Die GetPassword-Methode überprüft auch den Wert der RequiresQuestionAndAnswer-Eigenschaft. Wenn die RequiresQuestionAndAnswer-Eigenschaft den Wert true hat, überprüft die GetPassword-Methode den Wert des angegebenen Antwortparameters anhand der gespeicherten Kennwortantwort in der Datenquelle. Wenn es keine Übereinstimmung gibt, wird eine MembershipPasswordException ausgelöst.

GetUserNameByEmail-Methode

Verwendet eine E-Mail-Adresse als Eingabe und gibt den ersten Benutzernamen aus der Datenquelle zurück, dessen E-Mail-Adresse mit dem angegebenen email-Parameterwert übereinstimmt.

Wenn kein Benutzername mit einer passenden E-Mail-Adresse gefunden wird, wird eine leere Zeichenfolge zurückgegeben.

Wenn mehrere Benutzernamen mit einer passenden E-Mail-Adresse gefunden werden, wird nur der erste Benutzername zurückgegeben.

ChangePassword-Methode

Verwendet den Benutzernamen, das aktuelle Kennwort und ein neues Kennwort als Eingabe und aktualisiert das Kennwort in der Datenquelle, wenn der angegebene Benutzername und das aktuelle Kennwort gültig sind. Die ChangePassword-Methode gibt true zurück, wenn das Kennwort erfolgreich aktualisiert wurde. Ansonsten wird false zurückgegeben.

Die ChangePassword-Methode löst das ValidatingPassword-Ereignis aus, wenn ein MembershipValidatePasswordEventHandler angegeben wurde. Abhängig vom Ergebnis des Ereignisses wird der Vorgang zum Ändern des Kennworts fortgesetzt oder abgebrochen. Sie können die virtuelle OnValidatingPassword-Methode verwenden, um den angegebenen MembershipValidatePasswordEventHandler auszuführen.

ChangePasswordQuestionAndAnswer-Methode

Verwendet den Benutzernamen, das Kennwort, eine Kennwortfrage sowie eine Kennwortantwort als Eingabe und aktualisiert die Kennwortfrage und -antwort in der Datenquelle, wenn der angegebene Benutzername und das Kennwort gültig sind. Die ChangePasswordQuestionAndAnswer-Methode gibt true zurück, wenn die Kennwortfrage und -antwort erfolgreich aktualisiert wurden. Ansonsten wird false zurückgegeben.

Wenn der angegebene Benutzername und das Kennwort nicht gültig sind, wird false zurückgegeben.

FindUsersByName-Methode

Gibt eine Liste von Mitgliedschaftsbenutzern zurück, deren Benutzername mit dem angegebenen usernameToMatch für den konfigurierten ApplicationName übereinstimmt. Wenn zum Beispiel der usernameToMatch-Parameter auf "Benutzer" festgelegt ist, werden die Benutzer "Benutzer1", "Benutzer2", "Benutzer3" usw. zurückgegeben. Platzhalter werden abhängig von der Datenquelle unterstützt. Benutzer werden in der alphabetischen Reihenfolge der Benutzernamen zurückgegeben.

Die von der FindUsersByName-Methode zurückgegebenen Ergebnisse werden vom pageIndex-Parameter und vom pageSize-Parameter eingeschränkt. Der pageSize-Parameter bezeichnet die Anzahl von MembershipUser-Objekten, die in der MembershipUserCollection zurückgegeben werden sollen. Der pageIndex-Parameter gibt an, welche Ergebnisseite zurückgegeben wird, wobei 1 für die erste Seite steht. Der totalRecords-Parameter ist ein out-Parameter, der auf die Gesamtzahl der Mitgliedschaftsbenutzer festgelegt wird, die mit dem usernameToMatch-Wert übereinstimmen. Wenn beispielsweise 13 Benutzer gefunden wurden, die ganz oder teilweise mit dem usernameToMatch übereinstimmen, und pageIndex den Wert 2 und pageSize den Wert 5 hat, enthält die zurückgegebene MembershipUserCollection den sechsten bis einschließlich den zehnten zurückgegebenen Benutzer. totalRecords wird dann auf 13 festgelegt.

FindUsersByEmail-Methode

Gibt eine Liste von Mitgliedschaftsbenutzern zurück, deren Benutzername mit dem angegebenen emailToMatch für den konfigurierten ApplicationName übereinstimmt. Wenn zum Beispiel der emailToMatch-Parameter auf "adresse@example.com" festgelegt wurde, werden Benutzer mit den E-Mail-Adressen "adresse1@example.com", "adresse2@example.com" usw. zurückgegeben. Platzhalter werden abhängig von der Datenquelle unterstützt. Benutzer werden in der alphabetischen Reihenfolge der Benutzernamen zurückgegeben.

Die von FindUsersByEmail zurückgegebenen Ergebnisse werden vom pageIndex-Parameter und vom pageSize-Parameter eingeschränkt. Der pageSize-Parameter bezeichnet die Anzahl von MembershipUser-Objekten, die in der MembershipUserCollection-Auflistung zurückgegeben werden sollen. Der pageIndex-Parameter gibt an, welche Ergebnisseite zurückgegeben wird, wobei 1 für die erste Seite steht. Der totalRecords-Parameter ist ein out-Parameter, der auf die Gesamtzahl der Mitgliedschaftsbenutzer festgelegt wird, die mit dem emailToMatch-Wert übereinstimmen. Wenn beispielsweise 13 Benutzer gefunden wurden, die ganz oder teilweise mit dem emailToMatch übereinstimmen, und pageIndex den Wert 2 und pageSize den Wert 5 hat, enthält die zurückgegebene MembershipUserCollection den sechsten bis einschließlich den zehnten zurückgegebenen Benutzer. totalRecords wird dann auf 13 festgelegt.

UnlockUser-Methode

Verwendet einen Benutzernamen als Eingabe und aktualisiert das Feld in der Datenquelle, das die IsLockedOut-Eigenschaft speichert, mit dem Wert false. Die UnlockUser-Methode gibt true zurück, wenn der Datensatz für den Mitgliedschaftsbenutzer erfolgreich aktualisiert wurde. Ansonsten wird false zurückgegeben.

Mitgliedschaftsanbieter speichern Benutzerinformationen für jede Anwendung eindeutig. Somit kann dieselbe Datenquelle von mehren ASP.NET-Anwendungen verwendet werden, ohne dass die Erstellung doppelter Benutzernamen zu einem Konflikt führt. Alternativ dazu können mehrere ASP.NET-Anwendungen dieselbe Benutzerdatenquelle durch Angabe desselben ApplicationName verwenden.

Da Benutzerinformationen von Mitgliedschaftsanbietern für jede Anwendung eindeutig gespeichert werden, müssen Datenschema, Abfragen sowie Aktualisierungen den Anwendungsnamen enthalten. Der folgende Befehl wird beispielsweise verwendet, um einen Benutzernamen anhand der E-Mail-Adresse aus einer Datenbank abzurufen. Dabei wird sichergestellt, dass die ApplicationName-Eigenschaft in der Abfrage enthalten ist.

SELECT Username FROM MyUserTable 
  WHERE Email = 'someone@example.com' AND ApplicationName = 'MyApplication'

Sie können die Mitgliedschaftsanbieterschnittstellen um zusätzliche Funktionen erweitern, die von der abstrakten Klasse ProviderBase und der abstrakten Klasse MembershipProvider nicht zur Verfügung gestellt werden. Alle öffentlichen Member, die Sie zu Ihrem Mitgliedschaftsanbieter hinzufügen, sind über die Provider-Eigenschaft oder die Providers-Eigenschaft der Membership-Klasse zugänglich.

Ein Beispiel hierfür wäre eine LockUser-Methode, die die IsLockedOut-Eigenschaft auf den Wert true festlegt. Das folgende Beispiel veranschaulicht, wie die Provider-Eigenschaft, die den Standardmitgliedschaftsanbieter für eine Anwendung verfügbar macht, für den Aufruf der benutzerdefinierten LockUser-Methode in einen benutzerdefinierten Anbietertyp umgewandelt wird.

MyCustomProvider p = (MyCustomProvider)Membership.Provider;
p.LockUser(username);

Für jeden Mitgliedschaftsanbieter, der in der Konfiguration einer Anwendung angegeben ist, instanziiert ASP.NET eine einzelne Mitgliedschaftsanbieterinstanz, die für alle von einem HttpApplication-Objekt verarbeiteten Anfragen verwendet wird. Folglich können mehrere Anforderungen gleichzeitig ausgeführt werden. ASP.NET gewährleistet nicht die Threadsicherheit der Aufrufe zum Anbieter. Sie müssen selbst dafür sorgen, dass der Anbietercode threadsicher ist. Beispielsweise sollte das Herstellen einer Verbindung mit einer Datenbank oder das Öffnen einer Datei zum Bearbeiten im aufgerufenen Member erfolgen (z. B. CreateUser). Dagegen sollte es vermieden werden, eine Datei zu öffnen oder eine Datenbankverbindung aufzubauen, wenn die Initialize-Methode aufgerufen wird.

Community-Beiträge

HINZUFÜGEN
Anzeigen: