private static XmlDocument SignSamlRequest(AuthnRequestType request, string signatureNsPrefix, bool includePublicKey, string sslCertificateThumbprint) { X509Certificate2 cert = SignUtil.LoadCertificate(StoreName.My, StoreLocation.LocalMachine, sslCertificateThumbprint); XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("samlp", _samlProtocolNs); if (!string.IsNullOrEmpty(signatureNsPrefix)) { ns.Add(signatureNsPrefix, SignUtil.SignatureNamespace); } ns.Add("egovbga", _eauthExtNs); ns.Add("saml", _samlAssertionNs); XmlDocument doc = request.ToXmlDocument(ns); XmlElement signatureElement = SignUtil.Sign(doc, cert, signatureNsPrefix, includePublicKey); // Подписът вече е добавен в XML документа и по подразбиране е в края му. Според "saml-schema-protocol-2.0.xsd" обаче, // подписът трябва да бъде между елементите Issuer и Extensions. InsertAfter() го маха от старото място и го закача на новото. XmlNode issuerElement = doc.GetElementsByTagName(nameof(request.Issuer), _samlAssertionNs)[0]; doc.DocumentElement.InsertAfter(signatureElement, issuerElement); return(doc); }