Sdílet prostřednictvím


Postupy: Vytvoření služby tokenů zabezpečení

Služba tokenů zabezpečení implementuje protokol definovaný ve specifikaci WS-Trust. Tento protokol definuje formáty zpráv a vzory výměny zpráv pro vydávání, obnovování, rušení a ověřování tokenů zabezpečení. Daná služba tokenů zabezpečení poskytuje jednu nebo více těchto funkcí. Toto téma se zabývá nejběžnějším scénářem: implementace vystavování tokenů.

Vystavování tokenů

WS-Trust definuje formáty zpráv založené na elementu RequestSecurityToken schématu XSD (XML Schema Definition Language) a RequestSecurityTokenResponse elementu schématu XSD pro provádění vystavování tokenů. Kromě toho definuje přidružené identifikátory URI (Action Uniform Resource Identifier). Identifikátor URI akce přidružený ke RequestSecurityToken zprávě je http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue. Identifikátor URI akce přidružený ke RequestSecurityTokenResponse zprávě je http://schemas.xmlsoap.org/ws/2005/02/trust/RSTR/Issue.

Struktura zpráv požadavku

Struktura zpráv žádosti o problém se obvykle skládá z následujících položek:

  • Identifikátor URI typu požadavku s hodnotou http://schemas.xmlsoap.org/ws/2005/02/trust/Issue.

  • Identifikátor URI typu tokenu. Pro tokeny SAML (Security Assertions Markup Language) 1.1 je http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1hodnota tohoto identifikátoru URI .

  • Hodnota velikosti klíče, která označuje počet bitů v klíči, které se mají přidružit k vystaveným tokenu.

  • Identifikátor URI typu klíče. Pro symetrické klíče je http://schemas.xmlsoap.org/ws/2005/02/trust/SymmetricKeyhodnota tohoto identifikátoru URI .

Kromě toho může existovat několik dalších položek:

  • Klíčový materiál poskytovaný klientem.

  • Informace o oboru označující cílovou službu, se kterou se bude vystavený token používat.

Služba tokenu zabezpečení používá informace ve zprávě žádosti o problém při vytváření zprávy Odpovědi na problém.

Struktura zprávy odpovědi

Struktura zprávy odpovědi na problém se obvykle skládá z následujících položek;

  • Vystavený token zabezpečení, například kontrolní výraz SAML 1.1.

  • Ověřovací token přidružený k tokenu zabezpečení. U symetrických klíčů se často jedná o šifrovanou formu materiálu klíče.

  • Odkazy na vydaný token zabezpečení. Služba tokenu zabezpečení obvykle vrací odkaz, který lze použít při zobrazení vydaného tokenu v následující zprávě odeslané klientem a další, kterou lze použít, když token není k dispozici v následných zprávách.

Kromě toho může existovat několik dalších položek:

  • Klíčový materiál poskytovaný službou tokenů zabezpečení

  • Algoritmus potřebný k výpočtu sdíleného klíče.

  • Informace o životnosti vydaného tokenu

Zpracování zpráv žádosti

Služba tokenů zabezpečení zpracuje žádost o problém prozkoumáním různých částí zprávy žádosti a zajištěním, že může vydat token, který požadavek splňuje. Služba tokenů zabezpečení musí před vytvořením tokenu, který se má vystavit, určit následující:

  • Žádost je ve skutečnosti žádost o vystavení tokenu.

  • Služba tokenů zabezpečení podporuje požadovaný typ tokenu.

  • Žadatel má oprávnění k provedení žádosti.

  • Služba tokenů zabezpečení může splňovat očekávání žadatele v souvislosti s klíčovým materiálem.

Dvě důležité části vytváření tokenu určují, s jakým klíčem se má token podepsat a s jakým klíčem se má sdílený klíč zašifrovat. Token je potřeba podepsat, aby když klient prezentuje token cílové službě, může tato služba určit, že token vydala služba tokenu zabezpečení, které důvěřuje. Klíčový materiál musí být zašifrován tak, aby cílová služba mohl tento materiál klíče dešifrovat.

Podepsání kontrolního výrazu SAML zahrnuje vytvoření SigningCredentials instance. Konstruktor pro tuto třídu přebírá následující:

  • Klíč SecurityKey , který se má použít k podepsání kontrolního výrazu SAML.

  • Řetězec identifikující algoritmus podpisu, který se má použít.

  • Řetězec identifikující algoritmus digest, který se má použít.

  • Volitelně můžete určit klíč, SecurityKeyIdentifier který se má použít k podepsání kontrolního výrazu.

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

Šifrování sdíleného klíče zahrnuje převzetí materiálu klíče a jeho šifrování pomocí klíče, který může cílová služba použít k dešifrování sdíleného klíče. Obvykle se používá veřejný klíč cílové služby.

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

Kromě toho je potřeba použít SecurityKeyIdentifier šifrovaný klíč.

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

To SecurityKeyIdentifier se pak použije k vytvoření SamlSubject jako součást 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

Další informace najdete v tématu Ukázka federace.

Vytváření zpráv odpovědí

Jakmile služba tokenu zabezpečení zpracuje žádost o problém a vytvoří token, který se má vystavit spolu s ověřovacím klíčem, je potřeba vytvořit zprávu odpovědi, včetně alespoň požadovaného tokenu, ověřovacího tokenu a odkazů na vystavené tokeny. Vystavený token je obvykle vytvořený SamlSecurityToken z objektu SamlAssertion, jak je znázorněno v následujícím příkladu.

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

V případě, že služba tokenu zabezpečení poskytuje materiál sdíleného klíče, je token kontroly vytvořen vytvořením BinarySecretSecurityToken.

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

End Function

Další informace o tom, jak sestavit token kontroly, když klient a služba tokenů zabezpečení poskytují klíč materiálu pro sdílený klíč, naleznete v části Ukázka federace.

Vystavené odkazy na tokeny jsou vytvořené vytvořením instancí SecurityKeyIdentifierClause třídy.

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

Tyto různé hodnoty se pak serializují do zprávy odpovědi vrácené klientovi.

Příklad

Úplný kód pro službu tokenů zabezpečení najdete v ukázce federace.

Viz také