The following code fragment shows the custom output filter for the custom security assertion. The custom filter provides three methods:
CustomSecurityClientOutputFilterHok |
Class constructor that creates token and message signature objects for the SOAP message. |
SecureMessage |
An override method for the .NET method SendSecurityFilter.SecureMessage. The override method adds the SAML token and message signature to the .NET Security element. |
CreateKeyInfoSignatureElement |
Creates an XML document that specifies the SAML token type and ID. |
Output Filter for the Custom SecurityPolicyAssertion
internal class CustomSecurityClientOutputFilterHok : SendSecurityFilter
{
IssuedToken issuedToken = null;
string samlAssertionId = null;
MessageSignature messageSignature = null;
/// Create a custom SOAP request filter.
/// (Save the token and certificate.)
public CustomSecurityClientOutputFilterHok(CustomSecurityAssertionHok parentAssertion)
: base(parentAssertion.ServiceActor, true)
{
issuedToken = new IssuedToken(parentAssertion.BinaryToken, parentAssertion.TokenType);
samlAssertionId = parentAssertion.BinaryToken.Attributes.GetNamedItem("ID").Value;
messageSignature = new MessageSignature(parentAssertion.SecurityToken);
}
/// Secure the SOAP message before its sent to the server.
public override void SecureMessage(SoapEnvelope envelope, Security security)
{
//create KeyInfo XML element
messageSignature.KeyInfo = new KeyInfo();
messageSignature.KeyInfo.LoadXml(CreateKeyInfoSignatureElement());
security.Tokens.Add(issuedToken);
security.Elements.Add(messageSignature);
}
/// Helper method to create a custom key info signature element.
/// Returns Key info XML element.
private XmlElement CreateKeyInfoSignatureElement()
{
var xmlDocument = new XmlDocument();
xmlDocument.LoadXml(@"<root><SecurityTokenReference
xmlns=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd""
xmlns:wsse=""http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd""
wsse:TokenType=""http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV2.0"">
<KeyIdentifier
xmlns=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd""
ValueType=""http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLID"">"
+ samlAssertionId + @"</KeyIdentifier></SecurityTokenReference></root>");
return xmlDocument.DocumentElement;
}