Dela via


Anvisningar: Skapa en säkerhetstokentjänst

En säkerhetstokentjänst implementerar det protokoll som definierats i WS-Trust-specifikationen. Det här protokollet definierar meddelandeformat och mönster för meddelandeutbyte för utfärdande, förnyelse, avbruten och validering av säkerhetstoken. En viss säkerhetstokentjänst tillhandahåller en eller flera av dessa funktioner. Det här avsnittet tittar på det vanligaste scenariot: implementering av tokenutfärding.

Utfärda token

WS-Trust definierar meddelandeformat baserat på RequestSecurityToken schemaelementet XSD (XML Schema Definition Language) och RequestSecurityTokenResponse XSD-schemaelementet för att utföra tokenutfärdande. Dessutom definieras de associerade URI:erna (Action Uniform Resource Identifiers). Åtgärds-URI:n som är associerad med RequestSecurityToken meddelandet är http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue. Åtgärds-URI:n som är associerad med RequestSecurityTokenResponse meddelandet är http://schemas.xmlsoap.org/ws/2005/02/trust/RSTR/Issue.

Begärandemeddelandestruktur

Meddelandestrukturen för ärendebegäran består vanligtvis av följande objekt:

  • En URI för begärandetyp med värdet http://schemas.xmlsoap.org/ws/2005/02/trust/Issue.

  • En tokentyps-URI. För SAML-token (Security Assertions Markup Language) 1.1 är http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1värdet för den här URI:n .

  • Ett nyckelstorleksvärde som anger antalet bitar i nyckeln som ska associeras med den utfärdade token.

  • En nyckeltyps-URI. För symmetriska nycklar är http://schemas.xmlsoap.org/ws/2005/02/trust/SymmetricKeyvärdet för den här URI:n .

Dessutom kan ett par andra objekt finnas:

  • Nyckelmaterial som tillhandahålls av klienten.

  • Omfångsinformation som anger den måltjänst som den utfärdade token ska användas med.

Tjänsten för säkerhetstoken använder informationen i meddelandet för ärendebegäran när meddelandet Ärendesvar skapas.

Struktur för svarsmeddelande

Meddelandestrukturen för ärendesvar består vanligtvis av följande objekt.

  • Den utfärdade säkerhetstoken, till exempel en SAML 1.1-försäkran.

  • En bevistoken som är associerad med säkerhetstoken. För symmetriska nycklar är detta ofta en krypterad form av nyckelmaterialet.

  • Referenser till den utfärdade säkerhetstoken. Vanligtvis returnerar säkerhetstokentjänsten en referens som kan användas när den utfärdade token visas i ett efterföljande meddelande som skickas av klienten och ett annat som kan användas när token inte finns i efterföljande meddelanden.

Dessutom kan ett par andra objekt finnas:

  • Nyckelmaterial som tillhandahålls av säkerhetstokentjänsten.

  • Algoritmen som behövs för att beräkna den delade nyckeln.

  • Livslängdsinformation för den utfärdade token.

Bearbeta begärandemeddelanden

Tjänsten för säkerhetstoken bearbetar problembegäran genom att undersöka de olika delarna i begärandemeddelandet och se till att den kan utfärda en token som uppfyller begäran. Tjänsten för säkerhetstoken måste fastställa följande innan den skapar den token som ska utfärdas:

  • Begäran är verkligen en begäran om att en token ska utfärdas.

  • Tjänsten för säkerhetstoken stöder den begärda tokentypen.

  • Beställaren har behörighet att göra begäran.

  • Tjänsten för säkerhetstoken kan uppfylla beställarens förväntningar när det gäller nyckelmaterial.

Två viktiga delar av att skapa en token är att avgöra vilken nyckel som token ska signeras med och vilken nyckel som den delade nyckeln ska krypteras med. Token måste signeras så att när klienten visar token för måltjänsten kan den tjänsten fastställa att token har utfärdats av en säkerhetstokentjänst som den litar på. Nyckelmaterialet måste krypteras på ett sådant sätt att måltjänsten kan dekryptera nyckelmaterialet.

Att signera en SAML-försäkran innebär att skapa en SigningCredentials instans. Konstruktorn för den här klassen tar följande:

  • A SecurityKey för nyckeln som ska användas för att signera SAML-försäkran.

  • En sträng som identifierar signaturalgoritmen som ska användas.

  • En sträng som identifierar den sammandragsalgoritm som ska användas.

  • Alternativt kan en SecurityKeyIdentifier som identifierar nyckeln som ska användas för att signera försäkran.

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

Kryptering av den delade nyckeln innebär att du tar nyckelmaterialet och krypterar det med en nyckel som måltjänsten kan använda för att dekryptera den delade nyckeln. Vanligtvis används den offentliga nyckeln för måltjänsten.

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

Dessutom krävs en SecurityKeyIdentifier för den krypterade nyckeln.

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

Detta SecurityKeyIdentifier används sedan för att skapa en som en SamlSubject del av 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

Mer information finns i Federationsexempel.

Skapa svarsmeddelanden

När tjänsten för säkerhetstoken bearbetar problembegäran och skapar den token som ska utfärdas tillsammans med bevisnyckeln måste svarsmeddelandet konstrueras, inklusive minst den begärda token, bevistoken och de utfärdade tokenreferenserna. Den utfärdade token är vanligtvis en SamlSecurityToken som skapats SamlAssertionfrån , som du ser i följande exempel.

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

Om tjänsten för säkerhetstoken tillhandahåller materialet för delad nyckel skapas bevistoken genom att skapa en BinarySecretSecurityToken.

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

End Function

Mer information om hur du konstruerar bevistoken när både klienten och säkerhetstokentjänsten tillhandahåller nyckelmaterial för den delade nyckeln finns i Federationsexempel.

De utfärdade tokenreferenserna skapas genom att skapa instanser av SecurityKeyIdentifierClause klassen.

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

Dessa olika värden serialiseras sedan i svarsmeddelandet som returneras till klienten.

Exempel

Fullständig kod för en säkerhetstokentjänst finns i Federationsexempel.

Se även