Vorgehensweise: Erstellen unterstützender Anmeldeinformationen

Sie können über ein benutzerdefiniertes Sicherheitsschema verfügen, für das mehrere Anmeldeinformationen erforderlich sind. Beispielsweise kann ein Dienst vom Client nicht nur den Benutzernamen und das Kennwort fordern, sondern auch Anmeldeinformationen, die belegen, dass der Client älter als 18 Jahre ist. Die zweite Anmeldeinformation ist eine unterstützende Anmeldeinformation. In diesem Thema erfahren Sie, wie Sie Anmeldeinformationen in einem WCF-Client (Windows Communication Foundation) implementieren.

Hinweis

Die Spezifikation für unterstützende Anmeldeinformationen ist Teil der WS-SecurityPolicy-Spezifikation. Weitere Informationen finden Sie unter Sicherheitsspezifikationen für Webdienste.

Unterstützende Token

Bei aktivierter Nachrichtensicherheit wird die Nachricht stets mit einer primären Anmeldeinformation geschützt (z. B. mit einem X.509-Zertifikat oder Kerberos-Ticket).

Gemäß Spezifikation verwendet eine Sicherheitsbindung zum Absichern des Nachrichtenaustauschs Token. Ein Token ist eine Darstellung einer Sicherheitsanmeldeinformation.

Die Sicherheitsbindung verwendet zum Erstellen einer Signatur ein in ihrer Richtlinie identifiziertes primäres Token. Diese Signatur wird als Nachrichtensignatur bezeichnet.

Es können zusätzliche Token angegeben werden, um die von dem der Nachrichtensignatur zugeordneten Token bereitgestellten Ansprüche zu erweitern.

Unterzeichnen, Signieren und Verschlüsseln

Eine unterstützende Anmeldeinformation führt zu einem unterstützenden Token, das in der Nachricht übertragen wird. Die WS-SecurityPolicy-Spezifikation definiert vier Methoden zum Anhängen eines unterstützenden Tokens an die Nachricht, wie in der folgenden Tabelle beschrieben.

Zweck Beschreibung
Signiert Das unterstützende Token ist im Sicherheitsheader enthalten und wird durch die Nachrichtensignatur signiert.
Unterzeichnend Ein bestätigendes Token dient zum Signieren der Nachrichtensignatur.
Signiert und unterzeichnend Signierte, unterzeichnende Token signieren das gesamte aus der Nachrichtensignatur erstellte ds:Signature-Element und werden selbst durch die Nachrichtensignatur signiert; d. h., beide Token (das für die Nachrichtensignatur verwendete Token und das signierte unterzeichnende Token) signieren einander.
Signiert und verschlüsselnd Signierte, verschlüsselte unterstützende Token sind signierte unterstützende Token, die beim Anzeigen im wsse:SecurityHeader auch verschlüsselt werden.

Programmieren von unterstützenden Anmeldeinformationen

Zum Erstellen eines Diensts, der unterstützende Token verwendet, müssen Sie ein <customBinding>-Element erstellen. Weitere Informationen finden Sie unter Vorgehensweise: Erstellen einer benutzerdefinierten Bindung mit dem SecurityBindingElement.

Der erste Schritt beim Erstellen einer benutzerdefinierten Bindung ist das Erstellen eines Sicherheitsbindungselements, das einer der folgenden drei Typen sein kann:

Alle Klassen erben vom SecurityBindingElement, das vier relevante Eigenschaften umfasst:

Bereiche

Für unterstützende Anmeldeinformationen existieren vier Bereiche:

  • Endpunkt unterstützende Token unterstützen alle Vorgänge eines Endpunkts. Die Anmeldeinformationen, die das unterstützende Token darstellt, können beim Aufrufen eines beliebigen Endpunktvorgangs verwendet werden.

  • Vorgang unterstützende Token unterstützen nur einen bestimmten Endpunktvorgang.

Wie durch die Eigenschaftennamen angegeben, können unterstützende Anmeldeinformationen erforderlich oder optional sein. Die unterstützenden Anmeldeinformationen werden verwendet, wenn sie vorhanden, aber nicht erforderlich sind; die Authentifizierung schlägt jedoch nicht fehl, wenn sie nicht vorhanden sind.

Prozeduren

So erstellen Sie eine benutzerdefinierte Bindung, die unterstützende Anmeldeinformationen enthält

  1. Erstellen Sie ein Sicherheitsbindungselement. Im nachfolgenden Beispiel wird ein SymmetricSecurityBindingElement mit dem UserNameForCertificate-Authentifizierungsmodus erstellt. Sie verwenden die CreateUserNameForCertificateBindingElement-Methode.

  2. Fügen Sie den unterstützenden Parameter der von der entsprechenden Eigenschaft (Endorsing, Signed, SignedEncrypted oder SignedEndorsed) zurückgegebenen Auflistung von Typen hinzu. Die Typen im System.ServiceModel.Security.Tokens-Namespace umfassen häufig verwendete Typen wie die X509SecurityTokenParameters.

Beispiel

Beschreibung

Im folgenden Beispiel wird eine Instanz des SymmetricSecurityBindingElement erstellt und eine Instanz der KerberosSecurityTokenParameters-Klasse der von der unterzeichenden Eigenschaft zurückgegebenen Auflistung hinzugefügt.

Code

public static Binding CreateMultiFactorAuthenticationBinding()
{
    HttpTransportBindingElement httpTransport = new HttpTransportBindingElement();

    // The message security binding element will be configured to require 2 tokens:
    // 1) A user name/password encrypted with the service token.
    // 2) A client certificate used to sign the message.

    // Instantiate a binding element that will require the user name/password token
    // in the message (encrypted with the server certificate).
    SymmetricSecurityBindingElement messageSecurity = SecurityBindingElement.CreateUserNameForCertificateBindingElement();

    // Create supporting token parameters for the client X.509 certificate.
    X509SecurityTokenParameters clientX509SupportingTokenParameters = new X509SecurityTokenParameters();
    // Specify that the supporting token is passed in the message send by the client to the service.
    clientX509SupportingTokenParameters.InclusionMode = SecurityTokenInclusionMode.AlwaysToRecipient;
    // Turn off derived keys.
    clientX509SupportingTokenParameters.RequireDerivedKeys = false;
    // Augment the binding element to require the client's X.509 certificate as an
    // endorsing token in the message.
    messageSecurity.EndpointSupportingTokenParameters.Endorsing.Add(clientX509SupportingTokenParameters);

    // Create a CustomBinding based on the constructed security binding element.
    return new CustomBinding(messageSecurity, httpTransport);
}

Siehe auch