public string GetRequest(AuthRequestFormat format)
{
const string protocol = "urn:oasis:names:tc:SAML:2.0:protocol";
const string assertion = "urn:oasis:names:tc:SAML:2.0:assertion";
using (var sw = new StringWriter())
{
var xws = new XmlWriterSettings {OmitXmlDeclaration = true};
using (var xw = XmlWriter.Create(sw, xws))
{
xw.WriteStartElement("samlp", "AuthnRequest", protocol);
xw.WriteAttributeString("ID", Id);
xw.WriteAttributeString("Version", "2.0");
xw.WriteAttributeString("IssueInstant", _issueInstant);
xw.WriteAttributeString("ProtocolBinding", "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST");
xw.WriteAttributeString("AssertionConsumerServiceURL", _assertionConsumerServiceUrl);
xw.WriteStartElement("saml", "Issuer", assertion);
xw.WriteString(_issuer);
xw.WriteEndElement();
xw.WriteStartElement("samlp", "NameIDPolicy", protocol);
xw.WriteAttributeString("Format", "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified");
xw.WriteAttributeString("AllowCreate", "true");
xw.WriteEndElement();
if (!string.IsNullOrEmpty(_audienceRestriction))
{
xw.WriteStartElement("saml", "Conditions", assertion);
xw.WriteStartElement("saml", "AudienceRestriction", assertion);
xw.WriteStartElement("saml", "Audience", assertion);
xw.WriteString(_audienceRestriction);
xw.WriteEndElement();
xw.WriteEndElement();
xw.WriteEndElement();
}
xw.WriteStartElement("samlp", "RequestedAuthnContext", protocol);
xw.WriteAttributeString("Comparison", _requestedAuthnContextComparisonMethod);
foreach (var authnContextClassRef in _authnContextClassRefs)
{
xw.WriteStartElement("saml", "AuthnContextClassRef", assertion);
xw.WriteString(authnContextClassRef);
xw.WriteEndElement();
}
xw.WriteEndElement();
xw.WriteEndElement();
}
var result = sw.ToString();
byte[] compressedBytes = null;
if (format.HasFlag(AuthRequestFormat.Compressed))
{
compressedBytes = Compress(result);
}
if (format.HasFlag(AuthRequestFormat.Base64))
{
result = Convert.ToBase64String(compressedBytes ?? Encoding.ASCII.GetBytes(result));
}
if (format.HasFlag(AuthRequestFormat.UrlEncode))
{
result = HttpUtility.UrlEncode(result);
}
return result;
}
}