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.1
hodnota 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/SymmetricKey
hodnota 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.