Procedure: Een beveiligingstokenservice maken
Een beveiligingstokenservice implementeert het protocol dat is gedefinieerd in de WS-Trust-specificatie. Dit protocol definieert berichtindelingen en berichtuitwisselingspatronen voor het uitgeven, vernieuwen, annuleren en valideren van beveiligingstokens. Een bepaalde beveiligingstokenservice biedt een of meer van deze mogelijkheden. In dit onderwerp wordt het meest voorkomende scenario besproken: tokenuitgifte implementeren.
Tokens uitgeven
WS-Trust definieert berichtindelingen, op basis van het XSD-schemaelement (XML Schema Definition Language) en RequestSecurityTokenResponse
het XSD-schema-element voor het RequestSecurityToken
uitvoeren van tokenuitgifte. Daarnaast worden de bijbehorende Actie Uniform Resource Identifiers (URI's) gedefinieerd. De actie-URI die aan het RequestSecurityToken
bericht is gekoppeld, is http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue
. De actie-URI die aan het RequestSecurityTokenResponse
bericht is gekoppeld, is http://schemas.xmlsoap.org/ws/2005/02/trust/RSTR/Issue
.
Berichtstructuur aanvragen
De structuur van het probleemaanvraagbericht bestaat doorgaans uit de volgende items:
Een aanvraagtype-URI met een waarde van
http://schemas.xmlsoap.org/ws/2005/02/trust/Issue
.Een tokentype-URI. Voor Security Assertions Markup Language (SAML) 1.1-tokens is
http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1
de waarde van deze URI.Een sleutelgroottewaarde die het aantal bits in de sleutel aangeeft dat moet worden gekoppeld aan het uitgegeven token.
Een sleuteltype-URI. Voor symmetrische sleutels is
http://schemas.xmlsoap.org/ws/2005/02/trust/SymmetricKey
de waarde van deze URI.
Daarnaast kunnen er een aantal andere items aanwezig zijn:
Sleutelmateriaal dat door de klant wordt geleverd.
Bereikinformatie die de doelservice aangeeft waarmee het uitgegeven token wordt gebruikt.
De beveiligingstokenservice gebruikt de informatie in het bericht van de aanvraag voor het probleem wanneer het antwoordbericht voor het probleem wordt samengesteld.
Structuur van antwoordberichten
De berichtstructuur van het probleemantwoord bestaat doorgaans uit de volgende items;
Het uitgegeven beveiligingstoken, bijvoorbeeld een SAML 1.1-assertie.
Een prooftoken dat is gekoppeld aan het beveiligingstoken. Voor symmetrische sleutels is dit vaak een versleutelde vorm van het sleutelmateriaal.
Verwijzingen naar het uitgegeven beveiligingstoken. Normaal gesproken retourneert de beveiligingstokenservice een verwijzing die kan worden gebruikt wanneer het uitgegeven token wordt weergegeven in een volgend bericht dat door de client wordt verzonden en een andere die kan worden gebruikt wanneer het token niet aanwezig is in volgende berichten.
Daarnaast kunnen er een aantal andere items aanwezig zijn:
Sleutelmateriaal dat wordt geleverd door de beveiligingstokenservice.
Het algoritme dat nodig is om de gedeelde sleutel te berekenen.
Levensduurinformatie voor het uitgegeven token.
Aanvraagberichten verwerken
De beveiligingstokenservice verwerkt de aanvraag voor het probleem door de verschillende onderdelen van het aanvraagbericht te onderzoeken en ervoor te zorgen dat er een token kan worden verzonden dat voldoet aan de aanvraag. De beveiligingstokenservice moet het volgende bepalen voordat het token wordt gemaakt dat moet worden uitgegeven:
De aanvraag is echt een aanvraag voor een token dat moet worden uitgegeven.
De beveiligingstokenservice ondersteunt het aangevraagde tokentype.
De aanvrager is gemachtigd om de aanvraag te doen.
De beveiligingstokenservice kan voldoen aan de verwachtingen van de aanvrager met betrekking tot sleutelmateriaal.
Twee essentiƫle onderdelen van het maken van een token bepalen met welke sleutel het token moet worden ondertekend en met welke sleutel de gedeelde sleutel moet worden versleuteld. Het token moet worden ondertekend, zodat wanneer de client het token aan de doelservice presenteert, die service kan bepalen dat het token is uitgegeven door een beveiligingstokenservice die wordt vertrouwd. Het sleutelmateriaal moet zodanig worden versleuteld dat de doelservice dat sleutelmateriaal kan ontsleutelen.
Het ondertekenen van een SAML-assertie omvat het maken van een SigningCredentials exemplaar. De constructor voor deze klasse heeft het volgende:
Een SecurityKey voor de sleutel die moet worden gebruikt om de SAML-assertie te ondertekenen.
Een tekenreeks die het handtekening-algoritme identificeert dat moet worden gebruikt.
Een tekenreeks die het digest-algoritme identificeert dat moet worden gebruikt.
Optioneel, een SecurityKeyIdentifier die de sleutel identificeert die moet worden gebruikt om de assertie te ondertekenen.
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
Het versleutelen van de gedeelde sleutel omvat het nemen van het sleutelmateriaal en het versleutelen ervan met een sleutel die de doelservice kan gebruiken om de gedeelde sleutel te ontsleutelen. Normaal gesproken wordt de openbare sleutel van de doelservice gebruikt.
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
Daarnaast is een SecurityKeyIdentifier voor de versleutelde sleutel nodig.
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
Dit SecurityKeyIdentifier wordt vervolgens gebruikt om een SamlSubject
onderdeel van de 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
Zie Federatievoorbeeld voor meer informatie.
Antwoordberichten maken
Zodra de beveiligingstokenservice de aanvraag voor het probleem verwerkt en het token samen met de proof-sleutel samen met de bewijssleutel maakt, moet het antwoordbericht worden samengesteld, inclusief ten minste het aangevraagde token, het bewijstoken en de uitgegeven tokenverwijzingen. Het uitgegeven token is doorgaans een SamlSecurityToken gemaakt op basis van de SamlAssertion, zoals wordt weergegeven in het volgende voorbeeld.
SecurityToken CreateIssuedToken(SamlAssertion assertion)
{
return new SamlSecurityToken(assertion);
}
Function CreateIssuedToken(ByVal assertion As SamlAssertion) As SecurityToken
Return New SamlSecurityToken(assertion)
End Function
In het geval dat de beveiligingstokenservice het gedeelde sleutelmateriaal levert, wordt het bewijstoken samengesteld door een BinarySecretSecurityToken.
BinarySecretSecurityToken CreateProofToken(byte[] proofKey)
{
return new BinarySecretSecurityToken(proofKey);
}
Function CreateProofToken(ByVal proofKey() As Byte) As BinarySecretSecurityToken
Return New BinarySecretSecurityToken(proofKey)
End Function
Zie Federatievoorbeeld voor meer informatie over het samenstellen van het proof-token wanneer de client en de beveiligingstokenservice beide sleutelmateriaal voor de gedeelde sleutel leveren.
De uitgegeven tokenverwijzingen worden samengesteld door exemplaren van de SecurityKeyIdentifierClause klasse te maken.
SecurityKeyIdentifierClause CreateTokenReference(SamlSecurityToken token)
{
return token.CreateKeyIdentifierClause<SamlAssertionKeyIdentifierClause>();
}
Function CreateTokenReference(ByVal token As SamlSecurityToken) _
As SecurityKeyIdentifierClause
Return token.CreateKeyIdentifierClause( _
Of SamlAssertionKeyIdentifierClause)()
End Function
Deze verschillende waarden worden vervolgens geserialiseerd in het antwoordbericht dat naar de client wordt geretourneerd.
Opmerking
Zie Federatievoorbeeld voor volledige code voor een beveiligingstokenservice.