in wwauth/Google.Solutions.WWAuth/Data/Saml2/AuthenticationRequest.cs [117:176]
public override string ToString()
{
using (var output = new MemoryStream())
{
using (var zip = new DeflateStream(output, CompressionMode.Compress))
using (var streamWriter = new StreamWriter(zip, new UTF8Encoding(false)))
using (var writer = XmlWriter.Create(streamWriter))
{
var xml = ToDocument();
if (this.SigningCertificate != null)
{
var signedXml = new SignedXml(xml.DocumentElement)
{
SigningKey = this.SigningCertificate.GetRSAPrivateKey()
};
signedXml.SignedInfo.SignatureMethod = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256";
signedXml.SignedInfo.CanonicalizationMethod = "http://www.w3.org/2001/10/xml-exc-c14n#";
//
// Sign entire document using "SAML style" transforms.
//
var reference = new Reference()
{
Uri = string.Empty
};
reference.AddTransform(new XmlDsigEnvelopedSignatureTransform());
reference.AddTransform(new XmlDsigExcC14NTransform());
signedXml.AddReference(reference);
//
// Embed certificate.
//
var keyInfo = new KeyInfo();
keyInfo.AddClause(new KeyInfoX509Data(this.SigningCertificate));
signedXml.KeyInfo = keyInfo;
//
// Add signature after the Issuer element.
//
signedXml.ComputeSignature();
var issuer = xml.DocumentElement
.ChildNodes
.Cast<XmlNode>()
.OfType<XmlElement>()
.First(e => e.Name == "Issuer");
xml.DocumentElement.InsertAfter(
signedXml.GetXml(),
issuer);
}
xml.WriteTo(writer);
}
return Convert.ToBase64String(output.ToArray());
}
}