Vorgehensweise: Erstellen eines SicherheitstokendienstsHow to: Create a Security Token Service

Ein Sicherheitstokendienst implementiert das in der WS-Trust-Spezifikation definierte Protokoll.A security token service implements the protocol defined in the WS-Trust specification. Dieses Protokoll definiert Meldungsformate und Meldungsaustauschmuster zum Herausgeben, Erneuern, Abbrechen und Überprüfen von Sicherheitstoken.This protocol defines message formats and message exchange patterns for issuing, renewing, canceling, and validating security tokens. Ein angegebener Sicherheitstokendienst stellt eine oder mehrere dieser Fähigkeiten zur Verfügung.A given security token service provides one or more of these capabilities. Dieses Thema behandelt das am häufigsten verwendete Szenario: das Implementieren der Tokenausstellung.This topic looks at the most common scenario: implementing token issuance.

Ausstellen von TokenIssuing Tokens

WS-Trust definiert Meldungsformate basierend auf dem RequestSecurityToken-XSD-Schemaelement (XML Schema Definition Language) und dem RequestSecurityTokenResponse-XSD-Schemaelement zum Durchführen der Tokenausstellung.WS-Trust defines message formats, based on the RequestSecurityToken XML Schema definition language (XSD) schema element, and RequestSecurityTokenResponse XSD schema element for performing token issuance. Außerdem definiert WS-Trust die zugeordneten Aktions-URIs (Action Uniform Resource Identifiers).In addition, it defines the associated Action Uniform Resource Identifiers (URIs). Der Aktions-URI mit der RequestSecurityToken Nachricht http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue.The action URI associated with the RequestSecurityToken message is http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue. Der Aktions-URI mit der RequestSecurityTokenResponse Nachricht http://schemas.xmlsoap.org/ws/2005/02/trust/RSTR/Issue.The action URI associated with the RequestSecurityTokenResponse message is http://schemas.xmlsoap.org/ws/2005/02/trust/RSTR/Issue.

AnforderungsmeldungsstrukturRequest Message Structure

Die Anforderungsmeldungsstruktur für Probleme besteht normalerweise aus den folgenden Elementen:The issue request message structure typically consists of the following items:

Außerdem könnten ein paar andere Elemente vorhanden sein:In addition, a couple of other items might be present:

  • Schlüsselmaterial, das vom Client bereitgestellt wirdKey material provided by the client.

  • Umfangsinformationen, die den Zieldienst angeben, mit dem das ausgestellte Token verwendet wirdScope information that indicates the target service that the issued token will be used with.

Der Sicherheitstokendienst verwendet die Informationen in der Problemanforderungsmeldung für die Erstellung der Problemantwortmeldung.The security token service uses the information in the issue request message when it constructs the Issue Response message.

AntwortmeldungsstrukturResponse Message Structure

Die Antwortmeldungsstruktur für Probleme besteht normalerweise aus den folgenden Elementen:The issue response message structure typically consists of the following items;

  • dem ausgestellten Sicherheitstoken, z. B. eine SAML 1.1-AssertionThe issued security token, for example, a SAML 1.1 assertion.

  • einem dem Sicherheitstoken zugeordnete Prüftoken.A proof token associated with the security token. Für symmetrische Schlüssel ist dies oft eine verschlüsselte Form des Schlüsselmaterials.For symmetric keys, this is often an encrypted form of the key material.

  • Verweise auf das ausgestellte SicherheitstokenReferences to the issued security token. Der Sicherheitstokendienst gibt normalerweise einen Verweis zurück, der verwendet werden kann, wenn das ausgestellte Token in einer vom Client gesendeten nachfolgenden Meldung angezeigt wird, und einen Verweis, der verwendet werden kann, wenn das Token in nachfolgenden Meldungen nicht vorhanden ist.Typically, the security token service returns a reference that can be used when the issued token appears in a subsequent message sent by the client and another that can be used when the token is not present in subsequent messages.

Außerdem könnten ein paar andere Elemente vorhanden sein:In addition, a couple of other items might be present:

  • Vom Sicherheitstokendienst bereitgestelltes SchlüsselmaterialKey material provided by the security token service.

  • Der zum Berechnen des freigegebenen Schlüssels benötigte AlgorithmusThe algorithm needed to compute the shared key.

  • Lebensdauerinformationen für das ausgestellte Token.Lifetime information for the issued token.

Verarbeiten von AnforderungsmeldungenProcessing Request Messages

Der Sicherheitstokendienst verarbeitet die Problemanforderung durch Untersuchen der verschiedenen Teile der Anforderungsmeldung und durch Sicherstellen der Ausstellung eines Tokens, das der Anforderung entspricht.The security token service processes the issue request by examining the various pieces of the request message and ensuring that it can issue a token that satisfies the request. Der Sicherheitstokendienst muss Folgendes bestimmen, bevor er das auszustellende Token erstellt:The security token service must determine the following before it constructs the token to be issued:

  • Die Anforderung ist tatsächlich eine Anforderung für ein auszustellendes Token.The request really is a request for a token to be issued.

  • Der Sicherheitstokendienst unterstützt den angeforderten Tokentyp.The security token service supports the requested token type.

  • Der Anforderungsdienst wird zum Erstellen der Anforderungen autorisiert.The requester is authorized to make the request.

  • Der Sicherheitstokendienst kann den Erwartungen des Anforderungsdiensts in Bezug auf das Schlüsselmaterial entsprechen.The security token service can meet the requester's expectations with respect to key material.

Zwei wichtige Teile beim Erstellen eines Tokens bestehen im Bestimmen des Schlüssels, mit dem das Token signiert werden soll, und des Schlüssels, mit dem der freigegebene Schlüssel verschlüsselt werden soll.Two vital parts of constructing a token are determining what key to sign the token with and what key to encrypt the shared key with. Das Token muss signiert werden, damit der Dienst ermitteln kann, ob das Token von einem Sicherheitstokendienst ausgestellt wurde, dem er vertraut, wenn der Client dem Zieldienst das Token bereitstellt.The token needs to be signed so that when the client presents the token to the target service, that service can determine that the token was issued by a security token service that it trusts. Das Schlüsselmaterial muss in einer Art und Weise verschlüsselt werden, dass der Zieldienst das Schlüsselmaterial entschlüsseln kann.The key material needs to be encrypted in such a way that the target service can decrypt that key material.

Das Signieren einer SAML-Assertion schließt das Erstellen einer SigningCredentials-Instanz ein.Signing a SAML assertion involves creating a SigningCredentials instance. Der Konstruktor für diese Klasse kann Folgendes sein:The constructor for this class takes the following:

  • Ein SecurityKey für den Schlüssel zum Signieren der SAML-AssertionA SecurityKey for the key to use to sign the SAML assertion.

  • Eine Zeichenfolge, die den zu verwendenden Signaturalgorithmus identifiziertA string identifying the signature algorithm to use.

  • Eine Zeichenfolge, die den zu verwendenden Hashwertalgorithmus identifiziertA string identifying the digest algorithm to use.

  • Optional ein SecurityKeyIdentifier, der den Schlüssel identifiziert, der zum Signieren der Assertion verwendet werden soll.Optionally, a SecurityKeyIdentifier that identifies the key to use to sign the assertion.

void AddSigningCredentials(SamlAssertion assertion, SecurityKey signingKey)
{
    SigningCredentials sc = new SigningCredentials(signingKey,
        SecurityAlgorithms.RsaSha1Signature, SecurityAlgorithms.Sha1Digest);
    assertion.SigningCredentials = sc;
}
Sub AddSigningCredentials(ByVal assertion As SamlAssertion, _
    ByVal signingKey As SecurityKey)
    Dim sc As New SigningCredentials(signingKey, _
    SecurityAlgorithms.RsaSha1Signature, SecurityAlgorithms.Sha1Digest)
    assertion.SigningCredentials = sc

End Sub

Das Verschlüsseln des freigegebenen Schlüssels schließt das Verschlüsseln des Schlüsselmaterials mit einem Schlüssel ein, den der Zieldienst zum Entschlüsseln des freigegeben Schlüssels verwenden kann.Encrypting the shared key involves taking the key material and encrypting it with a key that the target service can use to decrypt the shared key. Normalerweise wird der öffentliche Schlüssel des Zieldiensts verwendet.Typically, the public key of the target service is used.

byte[] EncryptKey(byte[] plainTextKey, SecurityKey encryptingKey)
{
    return encryptingKey.EncryptKey(SecurityAlgorithms.RsaOaepKeyWrap, plainTextKey);
}
Function EncryptKey(ByVal plainTextKey() As Byte, _
        ByVal encryptingKey As SecurityKey) As Byte()
    Return encryptingKey.EncryptKey(SecurityAlgorithms.RsaOaepKeyWrap, plainTextKey)
End Function

Außerdem wird ein SecurityKeyIdentifier für den verschlüsselten Schlüssel benötigt.In addition, a SecurityKeyIdentifier for the encrypted key is needed.

SecurityKeyIdentifier GetKeyIdentifierForEncryptedKey(byte[] encryptedKey,
    SecurityToken encryptingToken)
{
    SecurityKeyIdentifier encryptingKeyIdentifier = new SecurityKeyIdentifier(encryptingToken.CreateKeyIdentifierClause<X509ThumbprintKeyIdentifierClause>());
    return new SecurityKeyIdentifier(new EncryptedKeyIdentifierClause(encryptedKey, SecurityAlgorithms.RsaOaepKeyWrap, encryptingKeyIdentifier));

}
Function GetKeyIdentifierForEncryptedKey(ByVal encryptedKey() _
 As Byte, ByVal encryptingToken As SecurityToken) _
    As SecurityKeyIdentifier
    Dim encryptingKeyIdentifier As New SecurityKeyIdentifier( _
        encryptingToken.CreateKeyIdentifierClause(Of X509ThumbprintKeyIdentifierClause)())
    Return New SecurityKeyIdentifier(New EncryptedKeyIdentifierClause( _
        encryptedKey, SecurityAlgorithms.RsaOaepKeyWrap, encryptingKeyIdentifier))
End Function

Dieser SecurityKeyIdentifier wird dann zum Erstellen eines SamlSubject als Teil des SamlToken verwendet.This SecurityKeyIdentifier is then used to create a SamlSubject as part of the SamlToken.

SamlSubject CreateSamlSubjectForProofKey(SecurityKeyIdentifier proofKeyIdentifier)
{
    List<string> confirmations = new List<string>();

    confirmations.Add("urn:oasis:names:tc:SAML:1.0:cm:holder-of-key");

    return new SamlSubject(null, null, "IssuerName", confirmations, null, proofKeyIdentifier);
}
Function CreateSamlSubjectForProofKey( _
    ByVal proofKeyIdentifier As SecurityKeyIdentifier) As SamlSubject
    Dim confirmations As List(Of String) = New List(Of String)()
    confirmations.Add("urn:oasis:names:tc:SAML:1.0:cm:holder-of-key")
    Return New SamlSubject(Nothing, Nothing, "IssuerName", _
        confirmations, Nothing, proofKeyIdentifier)
End Function

Weitere Informationen finden Sie unter Verbundbeispiel.For more information, see Federation Sample.

Erstellen von AntwortmeldungenCreating Response Messages

Sobald der Sicherheitstokendienst die Problemanforderung verarbeitet und das auszustellende Token zusammen mit dem Prüfschlüssel erstellt, muss die Antwortmeldung erstellt werden, die mindestens das angeforderte Token, das Prüftoken und die ausgestellten Tokenverweise enthalten muss.Once the security token service processes the issue request and constructs the token to be issued along with the proof key, the response message needs to be constructed, including at least the requested token, the proof token, and the issued token references. Das ausgestellte Token ist normalerweise ein aus der SamlSecurityToken erstelltes SamlAssertion, wie im folgenden Beispiel gezeigt.The issued token is typically a SamlSecurityToken created from the SamlAssertion, as shown in the following example.

SecurityToken CreateIssuedToken(SamlAssertion assertion)
{
    return new SamlSecurityToken(assertion);
}
Function CreateIssuedToken(ByVal assertion As SamlAssertion) As SecurityToken
    Return New SamlSecurityToken(assertion)
End Function

Wenn der Sicherheitstokendienst das freigegebene Schlüsselmaterial bereitstellt, wird das Prüftoken durch Erstellen eines BinarySecretSecurityToken erstellt.In the case where the security token service provides the shared key material, the proof token is constructed by creating a BinarySecretSecurityToken.

BinarySecretSecurityToken CreateProofToken(byte[] proofKey)
{
    return new BinarySecretSecurityToken(proofKey);
}
Function CreateProofToken(ByVal proofKey() As Byte) As BinarySecretSecurityToken
    Return New BinarySecretSecurityToken(proofKey)

End Function

Weitere Informationen, wie das Prüftoken erstellt, wenn sowohl der Client als auch dem Sicherheitstokendienst Schlüsselmaterial für den gemeinsam verwendeten Schlüssel bereitstellt, finden Sie unter Verbundbeispiel.For more information about how to construct the proof token when the client and the security token service both provide key material for the shared key, see Federation Sample.

Die ausgestellten Tokenverweise werden durch Erstellen von Instanzen der SecurityKeyIdentifierClause-Klasse erstellt.The issued token references are constructed by creating instances of the SecurityKeyIdentifierClause class.

SecurityKeyIdentifierClause CreateTokenReference(SamlSecurityToken token)
{
    return token.CreateKeyIdentifierClause<SamlAssertionKeyIdentifierClause>();
}
Function CreateTokenReference(ByVal token As SamlSecurityToken) _
    As SecurityKeyIdentifierClause
    Return token.CreateKeyIdentifierClause( _
    Of SamlAssertionKeyIdentifierClause)()
End Function

Diese verschiedenen Werte werden dann in der Antwortmeldung, die an den Client zurückgegeben wird, serialisiert.These various values are then serialized into the response message returned to the client.

BeispielExample

Vollständige Code für einen Sicherheitstokendienst finden Sie unter Verbundbeispiel.For full code for a security token service, see Federation Sample.

Siehe auchSee Also

SigningCredentials
SecurityKey
SecurityKeyIdentifier
SamlSecurityToken
SamlAssertion
BinarySecretSecurityToken
SecurityKeyIdentifierClause
VerbundbeispielFederation Sample