Freigeben über


Gewusst wie: Erstellen eines benutzerdefinierten Tokens

In diesem Thema wird beschrieben, wie Sie mit der SecurityToken-Klasse ein benutzerdefiniertes Sicherheitstoken erstellen und in einen benutzerdefinierten Sicherheitstokenanbieter und -authentifizierer integrieren.

Ein Sicherheitstoken ist im Wesentlichen ein XML-Element zur Darstellung von Ansprüchen bezüglich des Absenders in einer SOAP-Nachricht im Windows Communication Foundation (WCF)-Sicherheitsframework. Die WCF-Sicherheit verfügt über verschiedene Token für Authentifizierungsmodi, die vom System bereitgestellt werden. Dazu gehören u. a. ein Sicherheitstoken für ein X.509-Zertifikat, dargestellt durch die X509SecurityToken-Klasse, oder ein Sicherheitstoken für den Benutzernamen, dargestellt durch die UserNameSecurityToken-Klasse.

Möglicherweise werden Authentifizierungsmodi oder Anmeldeinformationen nicht von den bereitgestellten Typen unterstützt. In diesem Fall müssen Sie ein benutzerdefiniertes Sicherheitstoken erstellen, um eine XML-Darstellung der benutzerdefinierten Anmeldeinformationen in der SOAP-Nachricht bereitzustellen.

In den folgenden Verfahren wird veranschaulicht, wie ein benutzerdefiniertes Sicherheitstoken erstellt wird und wie dieses in die WCF-Sicherheitsinfrastruktur integriert wird. In diesem Thema wird ein Kreditkartentoken erstellt, mit dem Informationen über die Kreditkarte des Kunden an den Server übermittelt werden.

Weitere Informationen zu benutzerdefinierten Anmeldeinformationen sowie zum Sicherheitstoken-Manager finden Sie unter Gewusst wie: Erstellen von benutzerdefinierten Client- und Dienstanmeldeinformationen.

Weitere Klassen, die Sicherheitstoken darstellen, finden Sie im System.IdentityModel.Tokens-Namespace.

Weitere Informationen zu Anmeldeinformationen, zum Sicherheitstoken-Manager sowie zu Anbieter- und Authentifiziererklassen finden Sie unter Sicherheitsarchitektur.

Prozeduren

Clientanwendungen müssen über eine Möglichkeit zur Angabe von Kreditkarteninformationen für die Sicherheitsinfrastruktur verfügen. Diese Informationen werden von einer benutzerdefinierten Klasse für Clientanmeldeinformationen für die Anwendung verfügbar gemacht. Zunächst muss eine Klasse erstellt werden, um die Kreditkarteninformationen für die benutzerdefinierten Clientanmeldeinformationen darzustellen.

So erstellen Sie eine Klasse, die Kreditkarteninformationen in Clientanmeldeinformationen darstellt

  1. Definieren Sie eine neue Klasse, die die Kreditkarteninformationen für die Anwendung darstellt. Im folgenden Beispiel wird diese Klasse als CreditCardInfo bezeichnet.

  2. Fügen Sie der Klasse entsprechende Eigenschaften hinzu, damit die erforderlichen Informationen für das benutzerdefinierte Token von der Anwendung festgelegt werden können. In diesem Beispiel verfügt die Klasse über drei Eigenschaften: CardNumber, CardIssuer und ExpirationDate.

Im Anschluss muss eine Klasse erstellt werden, die das benutzerdefinierte Sicherheitstoken darstellt. Diese Klasse wird vom Sicherheitstokenanbieter, vom Sicherheitstokenauthentifizierer sowie von Serialisierungsprogrammklassen zum Übergeben von Informationen über das Sicherheitstoken an die und von der WCF-Sicherheitsinfrastruktur verwendet.

So erstellen Sie eine benutzerdefinierte Sicherheitstokenklasse

  1. Definieren Sie eine neue Klasse, die von der SecurityToken-Klasse abgeleitet ist. In diesem Beispiel wird eine Klasse mit der Bezeichnung CreditCardToken erstellt.

  2. Überschreiben Sie die Id-Eigenschaft. Mit dieser Eigenschaft wird der lokale Bezeichner des Sicherheitstokens abgerufen, mit dem von anderen Elementen in der SOAP-Nachricht auf die XML-Darstellung des Sicherheitstokens verwiesen wird. Der Bezeichner des Tokens in diesem Beispiel kann als Konstruktorparameter übergeben werden. Alternativ wird immer dann ein neuer Parameter generiert, wenn eine Instanz des Sicherheitstokens erstellt wird.

  3. Implementiert die SecurityKeys-Eigenschaft. Diese Eigenschaft gibt eine Auflistung von Sicherheitsschlüsseln zurück, die die Instanz des Sicherheitstokens darstellt. Diese Schlüssel können von WCF verwendet werden, um Teile der SOAP-Nachricht zu signieren oder zu verschlüsseln. Das Sicherheitstoken für die Kreditkarte kann in diesem Beispiel keine Sicherheitsschlüssel enthalten. Aus diesem Grund wird von der Implementierung stets eine leere Auflistung zurückgegeben.

  4. Überschreiben Sie die ValidFrom-Eigenschaft und die ValidTo-Eigenschaft. Diese Eigenschaften werden von WCF verwendet, um die Gültigkeit der Instanz des Sicherheitstokens zu bestimmen. Das Sicherheitstoken für die Kreditkarte in diesem Beispiel weist nur ein Ablaufdatum auf. Die ValidFrom-Eigenschaft gibt daher einen DateTime-Wert zurück, der das Datum und die Uhrzeit der Instanzerstellung enthält.

Wenn ein neuer Sicherheitstokentyp erstellt wird, ist eine Implementierung der SecurityTokenParameters-Klasse erforderlich. Mit dieser Implementierung wird in der Konfiguration des Sicherheitsbindungselements der neue Tokentyp dargestellt. Die Parameterklasse für das Sicherheitstoken dient als Vorlage zur Anpassung der Instanz des Sicherheitstokens, das beim Verarbeiten einer Nachricht verwendet wird. Die Vorlage stellt zusätzliche Eigenschaften bereit, mit der die Anwendung Kriterien angeben kann, die vom Sicherheitstoken für eine Verwendung oder Authentifizierung erfüllt werden müssen. Im folgenden Beispiel werden keine weiteren Eigenschaften hinzugefügt. Nur der Typ des Sicherheitstokens wird angepasst, wenn von der WCF-Infrastruktur eine Suche nach dem zu verwendenden oder zu überprüfenden Sicherheitstoken durchgeführt wird.

So erstellen Sie eine Parameterklasse für das benutzerdefinierte Sicherheitstoken

  1. Definieren Sie eine neue Klasse, die von der SecurityTokenParameters-Klasse abgeleitet ist.

  2. Implementieren Sie die CloneCore-Methode. Kopieren Sie ggf. alle in der Klasse definierten internen Felder. In diesem Beispiel werden keine weiteren Felder definiert.

  3. Implementieren Sie die schreibgeschützte SupportsClientAuthentication-Eigenschaft. Diese Eigenschaft gibt true zurück, wenn der Typ des Sicherheitstokens, der von dieser Klasse dargestellt wird, zur Authentifizierung eines Clients gegenüber einem Dienst verwendet werden kann. Das Sicherheitstoken der Kreditkarte kann in diesem Beispiel zur Authentifizierung eines Clients gegenüber einem Dienst verwendet werden.

  4. Implementieren Sie die schreibgeschützte SupportsServerAuthentication-Eigenschaft. Diese Eigenschaft gibt true zurück, wenn der Typ des Sicherheitstokens, der von dieser Klasse dargestellt wird, zur Authentifizierung eines Diensts gegenüber einem Client verwendet werden kann. Das Sicherheitstoken der Kreditkarte kann in diesem Beispiel nicht zur Authentifizierung eines Diensts gegenüber einem Client verwendet werden.

  5. Implementieren Sie die schreibgeschützte SupportsClientWindowsIdentity-Eigenschaft. Diese Eigenschaft gibt true zurück, wenn der Typ des Sicherheitstokens, der von dieser Klasse dargestellt wird, einem Windows-Konto zugeordnet werden kann. In diesem Fall wird das Ergebnis der Authentifizierung durch eine Instanz der WindowsIdentity-Klasse dargestellt. Das Token in diesem Beispiel kann keinem Windows-Konto zugeordnet werden.

  6. Implementieren Sie die CreateKeyIdentifierClause-Methode. Diese Methode wird vom WCF-Sicherheitsframework aufgerufen, wenn ein Verweis auf die Instanz des Sicherheitstokens erforderlich ist, das von der Parameterklasse für das Sicherheitstoken dargestellt wird. Sowohl die tatsächliche Instanz des Sicherheitstokens als auch der SecurityTokenReferenceStyle, der den angeforderten Verweistyp angibt, werden als Argumente an diese Methode übergeben. In diesem Beispiel werden vom Kreditkarten-Sicherheitstoken nur interne Verweise unterstützt. Mit der SecurityToken-Klasse können interne Verweise erstellt werden, sodass für die Implementierung kein zusätzlicher Code erforderlich ist.

  7. Implementieren Sie die InitializeSecurityTokenRequirement-Methode. Diese Methode wird von WCF aufgerufen, um die Instanz der Parameterklasse für das Sicherheitstoken in eine Instanz der SecurityTokenRequirement-Klasse zu konvertieren. Das Ergebnis wird von Sicherheitstokenanbietern zum Erstellen der entsprechenden Instanz des Sicherheitstokens verwendet.

Sicherheitstoken werden in SOAP-Nachrichten übertragen. Hierfür ist ein Übersetzungsmechanismus zwischen der Darstellung des Sicherheitstokens im Speicher und in der Übertragung erforderlich. WCF verwendet hierfür ein Sicherheitstoken-Serialisierungsprogramm. Für jedes benutzerdefinierte Token muss ein benutzerdefiniertes Sicherheitstoken-Serialisierungsprogramm verfügbar sein, mit dem das benutzerdefinierte Sicherheitstoken aus der SOAP-Nachricht serialisiert bzw. deserialisiert werden kann.

Tipp

Abgeleitete Schlüssel sind standardmäßig aktiviert. Wird ein benutzerdefiniertes Sicherheitstoken erstellt und als primäres Token verwendet, leitet WCF davon einen Schlüssel ab. Dabei wird das Serialisierungsprogramm für benutzerdefnierte Sicherheitstoken aufgerufen, um die SecurityKeyIdentifierClause für das benutzerdefinierte Sicherheitstoken zur Übertragung zu schreiben, während das DerivedKeyToken serialisiert wird. Auf der Empfangsseite erwartet das DerivedKeyToken-Serialisierungsprogramm beim Deserialisieren des Tokens aus der Übertragung ein SecurityTokenReference-Element als sich selbst untergeordnetes Element oberster Ebene. Wurde vom Serialisierungsprogramm für benutzerdefinierte Sicherheitstokens beim Serialisieren des eigenen Klauseltyps kein SecurityTokenReference-Element hinzugefügt, wird eine Ausnahme ausgelöst.

So erstellen Sie ein benutzerdefiniertes Sicherheitstoken-Serialisierungsprogramm

  1. Definieren Sie eine neue Klasse, die von der WSSecurityTokenSerializer-Klasse abgeleitet ist.

  2. Überschreiben Sie die CanReadTokenCore-Methode, die den XML-Stream mit dem XmlReader liest. Diese Methode gibt true zurück, wenn das Sicherheitstoken für das aktuelle Element von der Implementierung des Serialisierungsprogramms deserialisiert werden kann. In diesem Beispiel überprüft die Methode, ob das aktuelle XML-Element des XML-Readers den richtigen Namen und den richtigen Namespace aufweist. Ist dies nicht der Fall, wird die Basisklassenimplementierung dieser Methode aufgerufen, um das XML-Element zu behandeln.

  3. Überschreiben Sie die ReadTokenCore-Methode. Diese Methode wird zum Lesen des XML-Inhalts des Sicherheitstokens sowie zum Erstellen der entsprechenden Darstellung im Speicher verwendet. Wenn das XML-Element, das gerade vom übergebenen XML-Reader erfasst wird, von der Methode nicht erkannt wird, wird die Basisklassenimplementierung zur Verarbeitung der vom System bereitgestellten Tokentypen aufgerufen.

  4. Überschreiben Sie die CanWriteTokenCore-Methode. Diese Methode gibt true zurück, wenn die (als Argument übergebene) Darstellung des Tokens im Speicher in die XML-Darstellung konvertiert werden kann. Wenn dies nicht der Fall ist, wird die Basisklassenimplementierung aufgerufen.

  5. Überschreiben Sie die WriteTokenCore-Methode. Diese Methode konvertiert die Darstellung eines Sicherheitstokens im Speicher in eine XML-Darstellung. Andernfalls wird die Basisklassenimplementierung aufgerufen.

Integrieren Sie das benutzerdefinierte Sicherheitstoken nach Abschluss dieser vier Verfahren in den Anbieter, Authentifizierer, Manager und Client sowie in die Anmeldeinformationen des Diensts für das Sicherheitstoken.

So integrieren Sie das benutzerdefinierte Sicherheitstoken in einen Sicherheitstokenanbieter

  1. Der Sicherheitstokenanbieter erstellt das Token, ändert es gegebenenfalls und gibt eine Instanz des Tokens zurück. Um einen benutzerdefinierten Anbieter für das benutzerdefinierte Sicherheitstoken zu erstellen, erstellen Sie eine Klasse, die von der SecurityTokenProvider-Klasse erbt. Im folgenden Beispiel wird die GetTokenCore-Methode überschrieben, um eine Instanz von CreditCardToken zurückzugeben. Weitere Informationen zu benutzerdefinierten Sicherheitstokenanbietern finden Sie unter Gewusst wie: Erstellen eines benutzerdefinierten Sicherheitstokenanbieters.

So integrieren Sie das benutzerdefinierte Sicherheitstoken in einen Sicherheitstokenauthentifizierer

  1. Der Sicherheitstokenauthentifizierer überprüft den Inhalt des Sicherheitstokens beim Extrahieren aus der Nachricht. Um einen benutzerdefinierten Authentifizierer für das benutzerdefinierte Sicherheitstoken zu erstellen, erstellen Sie eine Klasse, die von der SecurityTokenAuthenticator-Klasse erbt. Im folgenden Beispiel wird die ValidateTokenCore-Methode überschrieben. Weitere Informationen zu benutzerdefinierten Sicherheitstokenauthentifizierern finden Sie unter Gewusst wie: Erstellen eines benutzerdefinierten Sicherheitstokenauthentifizierers.

So integrieren Sie das benutzerdefinierte Sicherheitstoken in einen Sicherheitstoken-Manager

  1. Der Sicherheitstoken-Manager erstellt die entsprechenden Instanzen für den Anbieter, den Sicherheitsauthentifizierer und das Serialisierungsprogramm für das Token. Zum Erstellen eines Managers für das benutzerdefinierte Token erstellen Sie eine Klasse, die von der ClientCredentialsSecurityTokenManager-Klasse erbt. Die primären Methoden der Klasse erstellen den entsprechenden Anbieter und den entsprechenden Client oder die entsprechenden Anmeldeinformationen für den Dienst mit einer SecurityTokenRequirement. Weitere Informationen zu benutzerdefinierten Sicherheitstoken-Managern finden Sie unter Gewusst wie: Erstellen von benutzerdefinierten Client- und Dienstanmeldeinformationen.

So integrieren Sie das benutzerdefinierte Sicherheitstoken in den benutzerdefinierten Client und die benutzerdefinierten Anmeldeinformationen des Diensts

  1. Der benutzerdefinierte Client und die benutzerdefinierten Anmeldeinformationen für den Dienst müssen hinzugefügt werden, damit eine API für die Anwendung Informationen zum benutzerdefinierten Token angeben kann, die von der zuvor erstellten Infrastruktur für das benutzerdefinierte Sicherheitstoken zur Bereitstellung und Authentifizierung von Inhalten für das benutzerdefinierte Sicherheitstoken verwendet werden können. Die folgenden Beispiele veranschaulichen diese Vorgehensweise. Weitere Informationen zu benutzerdefinierten Client- und Dienstanmeldeinformationen finden Sie unter Gewusst wie: Erstellen von benutzerdefinierten Client- und Dienstanmeldeinformationen.

Die zuvor erstellte Parameterklasse für das benutzerdefinierte Sicherheitstoken wird verwendet, um dem WCF-Sicherheitsframework mitzuteilen, dass für den Austausch von Informationen mit einem Dienst ein benutzerdefiniertes Sicherheitstoken verwendet werden soll. Das folgende Verfahren veranschaulicht die Vorgehensweise.

So integrieren Sie das benutzerdefinierte Sicherheitstoken in die Bindung

  1. Die Parameterklasse für das benutzerdefinierte Sicherheitstoken muss in einer der Tokenparameterauflistungen angegeben werden, die für die SecurityBindingElement-Klasse verfügbar gemacht werden. Im folgenden Beispiel wird die Auflistung verwendet, die von SignedEncrypted zurückgegeben wird. Mit diesem Code wird jeder Nachricht, die vom Client an den Dienst gesendet wird, das benutzerdefinierte Kreditkartentoken hinzugefügt, und der Inhalt wird automatisch signiert und verschlüsselt.

Siehe auch

Aufgaben

Gewusst wie: Erstellen eines benutzerdefinierten Sicherheitstokenanbieters

Referenz

SecurityToken
SecurityTokenParameters
WSSecurityTokenSerializer
SecurityTokenProvider
SecurityTokenAuthenticator
IAuthorizationPolicy
SecurityTokenRequirement
SecurityTokenManager
ClientCredentials
ServiceCredentials
SecurityBindingElement

Konzepte

Gewusst wie: Erstellen von benutzerdefinierten Client- und Dienstanmeldeinformationen
Gewusst wie: Erstellen eines benutzerdefinierten Sicherheitstokenauthentifizierers
Sicherheitsarchitektur