Freigeben über


Implementieren eines Rollenanbieters

Aktualisiert: November 2007

Mit der ASP.NET-Rollenverwaltung können Sie auf einfache Weise verschiedene Mitgliedschaftsanbieter für Ihre ASP.NET-Anwendungen verwenden. Sie können die vorhandenen Profilanbieter von .NET Framework verwenden oder einen eigenen Anbieter implementieren.

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

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

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

Erforderliche Klassen

Zum Implementieren eines Rollenanbieters erstellen Sie eine Klasse, die von der abstrakten RoleProvider-Klasse aus dem System.Web.Security-Namespace erbt. Die abstrakte RoleProvider-Klasse erbt die abstrakte ProviderBase-Klasse aus dem System.Configuration.Provider-Namespace. Daher müssen Sie auch die erforderlichen Member der ProviderBase-Klasse implementieren. In den folgenden Tabellen werden die Eigenschaften und Methoden aufgeführt, die Sie aus der abstrakten ProviderBase-Klasse und aus der abstrakten RoleProvider-Klasse 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 Rollenanbieterimplementierung.

ProviderBase-Member

Member

Beschreibung

Initialize-Methode

Als Eingabe wird der Name des Anbieters und eine NameValueCollection mit Konfigurationseinstellungen verwendet. Diese Methode wird dazu verwendet, Eigenschaftenwerte für die Anbieterinstanz festzulegen. Dazu gehören implementierungsspezifische Werte und Optionen, die in der Konfigurationsdatei (Machine.config oder Web.config) angegeben sind.

RoleProvider-Member

Member

Beschreibung

ApplicationName-Eigenschaft

Der Name der Anwendung, die die in der Konfigurationsdatei (Web.config) angegebenen Rolleninformationen verwendet. Der ApplicationName wird mit den entsprechenden Benutzerinformationen in der Datenquelle gespeichert und bei einer 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 (falls keine Angabe gemacht wird) dem ApplicationPath.

AddUsersToRoles-Methode

Verwendet als Eingabe eine Liste mit Benutzernamen und eine Liste mit Rollennamen und ordnet bei der Datenquelle für die Anwendung mit dem Namen ApplicationName die angegebenen Benutzer den angegebenen Rollen zu.

Sie sollten eine ProviderException auslösen, falls einer der angegebenen Rollen- oder Benutzernamen für die Anwendung mit dem Namen ApplicationName nicht vorhanden ist.

Sie sollten eine ArgumentException auslösen, wenn einer der angegebenen Benutzer- oder Rollennamen eine leere Zeichenfolge ist, und eine ArgumentNullException, wenn einer der angegebenen Benutzer- oder Rollennamen null ist (bzw. Nothing bei Visual Basic).

Wenn die Datenquelle Transaktionen unterstützt, sollten Sie jedes Hinzufügen in eine Transaktion einschließen. Wenn dann ein Hinzufügen fehlschlägt, führen Sie ein Rollback der Transaktion durch und lösen eine Ausnahme aus.

CreateRole-Methode

Verwendet als Eingabe den Namen einer Rolle und fügt die angegebene Rolle der Datenquelle für die Anwendung mit dem Namen ApplicationName hinzu.

Falls der angegebene Rollenname für die Anwendung mit dem Namen ApplicationName bereits vorhanden ist, sollten Sie eine ProviderException auslösen.

Sie sollten eine ArgumentException auslösen, wenn der angegebene Rollenname eine leere Zeichenfolge ist, ein Komma enthält oder die für die Datenquelle maximal zulässige Länge überschreitet. Wenn der angegebene Rollenname null ist (bzw. Nothing bei Visual Basic), sollten Sie eine ArgumentNullException auslösen.

DeleteRole-Methode

Verwendet als Eingabe den Namen einer Rolle und einen booleschen Wert, der angibt, ob eine Ausnahme ausgelöst werden soll, wenn der Rolle noch Benutzer zugeordnet sind. Die DeleteRole-Methode löscht die angegebene Rolle aus der Datenquelle für die Anwendung mit dem Namen ApplicationName.

Wenn der throwOnPopulatedRole-Parameter true ist und die vom Rollennamenparameter identifizierte Rolle mindestens einen Member hat, wird eine ProviderException ausgelöst, und die Rolle wird nicht gelöscht. Wenn der throwOnPopulatedRole-Parameter false ist, wird die Rolle gelöscht, unabhängig davon, ob sie leer ist oder nicht.

Stellen Sie beim Löschen einer Rolle aus der Datenquelle sicher, dass auch Zuordnungen zwischen einem Benutzernamen und der gelöschten Rolle für die Anwendung mit dem Namen ApplicationName gelöscht werden.

Lösen Sie eine ArgumentException aus, wenn der angegebene Rollenname nicht vorhanden oder eine leere Zeichenfolge ist. Lösen Sie eine ArgumentNullException aus, wenn der angegebene Rollenname null ist (bzw. Nothing bei Visual Basic).

FindUsersInRole-Methode

Verwendet als Eingabe einen Rollennamen und einen Benutzernamen und gibt eine Liste mit Benutzern in einer Rolle zurück, bei denen der Benutzername eine Übereinstimmung mit dem angegebenen usernameToMatch-Parameter enthält (bezieht sich auf die Anwendung mit dem Namen ApplicationName). Platzhalter werden abhängig von der Datenquelle unterstützt. Benutzer werden in der alphabetischen Reihenfolge der Benutzernamen zurückgegeben.

Es wird empfohlen, eine ProviderException auszulösen, wenn der angegebene Rollenname nicht in der Datenquelle vorhanden ist.

GetAllRoles-Methode

Gibt eine Liste aller in der Datenquelle vorhandenen Rollennamen zurück. Nur die Rollen für die Anwendung mit dem Namen ApplicationName werden abgerufen.

Falls keine Rollen für die Anwendung mit dem Namen ApplicationName vorhanden sind, sollten Sie ein Zeichenfolgenarray ohne Elemente zurückgeben.

GetRolesForUser-Methode

Verwendet als Eingabe einen Benutzernamen und gibt aus der Datenquelle die Rollennamen zurück, denen der angegebene Benutzer zugeordnet ist. Nur die Rollen für die Anwendung mit dem Namen ApplicationName werden abgerufen.

Falls für den angegebenen Benutzer keine Rollen für die Anwendung mit dem Namen ApplicationName vorhanden sind, sollten Sie ein Zeichenfolgenarray ohne Elemente zurückgeben.

Sie sollten eine ArgumentException auslösen, wenn der angegebene Benutzername eine leere Zeichenfolge ist. Lösen Sie eine ArgumentNullException aus, wenn der angegebene Benutzername null ist (bzw. Nothing bei Visual Basic).

GetUsersInRole-Methode

Verwendet als Eingabe einen Rollennamen und gibt aus der Datenquelle die Namen der Benutzer zurück, die dieser Rolle zugeordnet sind. Nur die Rollen für die Anwendung mit dem Namen ApplicationName werden abgerufen.

Wenn der angegebene Rollenname für die Anwendung mit dem Namen ApplicationName nicht vorhanden ist, sollte eine ProviderException ausgelöst werden.

Falls für die Anwendung mit dem Namen ApplicationName der angegebenen Rolle keine Benutzer zugeordnet sind, sollte ein Zeichenfolgenarray ohne Elemente zurückgegeben werden.

Wenn der angegebene Rollenname eine leere Zeichenfolge ist, ein Komma enthält oder die für die Datenquelle maximal zulässige Länge überschreitet, sollte eine ArgumentException ausgelöst werden. Lösen Sie eine ArgumentNullException aus, wenn der angegebene Rollenname null ist (bzw. Nothing bei Visual Basic).

IsUserInRole-Methode

Verwendet als Eingabe einen Benutzernamen und einen Rollennamen und bestimmt über die Datenquelle, ob der aktuell angemeldete Benutzer für die Anwendung mit dem Namen ApplicationName einer Rolle zugeordnet ist.

Sie sollten eine ProviderException auslösen, falls der angegebene Rollenname oder Benutzername für die Anwendung mit dem Namen ApplicationName nicht vorhanden ist.

Sie sollten eine ArgumentException auslösen, wenn der angegebene Benutzername oder Rollenname eine leere Zeichenfolge ist, und eine ArgumentNullException, wenn der angegebene Benutzername oder Rollenname null ist (bzw. Nothing bei Visual Basic).

RemoveUsersFromRoles-Methode

Verwendet als Eingabe eine Liste mit Benutzernamen und eine Liste mit Rollennamen und entfernt für die Anwendung mit dem Namen ApplicationName die Zuordnung der angegebenen Benutzer zu den angegebenen Rollen.

Sie sollten eine ProviderException auslösen, falls einer der angegebenen Rollennamen oder Benutzernamen für die Anwendung mit dem Namen ApplicationName nicht vorhanden ist.

Sie sollten eine ArgumentException auslösen, wenn einer der angegebenen Benutzer- oder Rollennamen eine leere Zeichenfolge ist, und eine ArgumentNullException, wenn einer der angegebenen Benutzer- oder Rollennamen null ist (bzw. Nothing bei Visual Basic).

Wenn die Datenquelle Transaktionen unterstützt, sollten Sie jedes Entfernen in eine Transaktion einschließen. Wenn dann ein Entfernen fehlschlägt, führen Sie ein Rollback der Transaktion durch und lösen eine Ausnahme aus.

RoleExists-Methode

Verwendet als Eingabe einen Rollennamen und bestimmt, ob in der Datenquelle der Rollenname für die Anwendung mit dem Namen ApplicationName vorhanden ist.

Lösen Sie eine ArgumentException aus, wenn der angegebene Rollenname nicht vorhanden oder eine leere Zeichenfolge ist. Es wird empfohlen, eine ArgumentNullException auszulösen, wenn der angegebene Rollenname null ist (bzw. Nothing bei Visual Basic).

ApplicationName

Rollenanbieter speichern die Rolleninformationen nach Anwendungen getrennt. Dadurch kann dieselbe Datenquelle von mehren ASP.NET-Anwendungen verwendet werden, ohne dass Konflikte wegen doppelt verwendeter Benutzernamen auftreten. Alternativ dazu können mehrere ASP.NET-Anwendungen durch Angabe desselben ApplicationName dieselbe Rollendatenquelle verwenden.

Da Rolleninformationen von Rollenanbietern für jede Anwendung eindeutig gespeichert werden, müssen Datenschema, Abfragen sowie Aktualisierungen den Anwendungsnamen enthalten. Der folgende Befehl wird beispielsweise verwendet, um einen Rollennamen aus einer Datenbank abzurufen und sicherzustellen, dass der ApplicationName in der Abfrage enthalten ist.

SELECT Rolename FROM Roles 
  WHERE Rolename = 'Administrators' AND ApplicationName = 'MyApplication'

Threadsicherheit

Für jeden Rollenanbieter, der in der Konfiguration einer Anwendung angegeben ist, instanziiert ASP.NET eine einzelne Rollenanbieterinstanz, 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. Das Herstellen einer Verbindung zu einer Datenbank oder das Öffnen einer Datei zum Bearbeiten sollte beispielsweise im aufgerufenen Member erfolgen (z. B. AddUsersToRoles). Dagegen sollte es vermieden werden, eine Datei zu öffnen oder eine Datenbankverbindung aufzubauen, wenn die Initialize-Methode aufgerufen wird.

Siehe auch

Konzepte

Beispiel für eine Rollenanbieterimplementierung

Sichern von Rollen

Weitere Ressourcen

Verwalten der Autorisierung mithilfe von Rollen