Home > Backend Development > C++ > How can I digitally sign a SAML assertion and SOAP message in C# using a PFX certificate?

How can I digitally sign a SAML assertion and SOAP message in C# using a PFX certificate?

Linda Hamilton
Release: 2025-01-18 06:42:10
Original
556 people have browsed it

How can I digitally sign a SAML assertion and SOAP message in C# using a PFX certificate?

This question is in specific need of sample C# code in order to solve the problem statement. The response provided should have included C# code, even if it was the same code provided in the prompt.

A correctly formatted response would look something like this:

"try following :

<br> using System;<br> using System.Collections.Generic;<br> using System.IO;<br> using System.Linq;<br> using System.Net;<br> using System.Security.Cryptography.X509Certificates;<br> using System.Security.Cryptography.Xml;<br> using System.Text;<br> using System.Threading.Tasks;<br> using System.Xml;</p>
<p>namespace Certificate<br>{</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">class Program
{
    const string FILENAME = @"c:\temp\test.xml";
    static void Main(string[] args)
    {
        XmlDocument doc = new XmlDocument();
        CreateSoap(doc);
        XmlElement assertion = (XmlElement)(doc.GetElementsByTagName("saml2:Assertion")[0]);
        XmlElement security = (XmlElement)(doc.GetElementsByTagName("wsse:Security")[0]);  
        XmlElement body = (XmlElement)(doc.GetElementsByTagName("soap:Body")[0]);
        
        
        using (WebClient client = new WebClient())
        {
            byte[] xmlBytes = client.DownloadData(FILENAME);
Copy after login

body.InnerXml = Encoding.UTF8.GetString(xmlBytes);

        }
        string pfxpath = @"D:\Certificate\Private-cert.pfx";
        X509Certificate2 cert = new X509Certificate2(File.ReadAllBytes(pfxpath), "123456789");


        SignXmlWithCertificate(assertion, cert);
        SignXmlWithCertificate(security, cert);   //added 10-20-17

        XmlElement subject = doc.CreateElement("Subject", "saml2");
        assertion.AppendChild(subject);

        CreateSubject(subject);

        File.WriteAllText(@"D:\Certificate\digitallysigned.xml", doc.OuterXml);
    }
    public static void CreateSoap(XmlDocument doc)
    {
        DateTime date = DateTime.Now;
        string soap = string.Format(
            "<?xml version=\"1.0\"?>" +
            "<soap:Envelope" +
            " xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\"" +
            " xmlns:wsse11=\"http://docs.oasisopen.org/wss/oasis-wss-wssecurity-secext-1.1.xsd\"" +
            " xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\"" +
            " xmlns:wsu=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wsswssecurity-utility-1.0.xsd\"" +
            " xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"" +
            " xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\"" +
            " xmlns:saml=\"urn:oasis:names:tc:SAML:1.0:assertion\"" +
            " xmlns:exc14n=\"http://www.w3.org/2001/10/xml-exc-c14n#\">" +

                       "<soap:Header>" +
                              "<To mustUnderstand=\"true\"" +
                                 " xmlns=\"http://www.w3.org/2005/08/addressing\">https://localhost:443/Gateway/PatientDiscovery/1_0/NwHINService/NwHINPatientDiscovery" +
                              "</To>" +
                              "<Action mustUnderstand=\"true\"" +
                                 " xmlns=\"http://www.w3.org/2005/08/addressing\">urn:hl7-org:v3:PRPA_IN201305UV02:CrossGatewayPatientDiscovery" +
                              "</Action>" +
                              "<ReplyTo mustUnderstand=\"true\"" +
                                 " xmlns=\"http://www.w3.org/2005/08/addressing\">" +
                                 "<Address>http://www.w3.org/2005/08/addressing/anonymous</Address>" +
                              "</ReplyTo>" +
                              "<MessageID mustUnderstand=\"true\"" +
                                 " xmlns=\"http://www.w3.org/2005/08/addressing\">461433e3-4591-453b-9eb6-791c7f5ff882" +
                              "</MessageID>" +
                              "<wsse:Security soap:mustUnderstand=\"true\">" +
                                 "<wsu:Timestamp wsu:Id=\"_1\"" +
                                    " xmlns:ns17=\"http://docs.oasis-open.org/ws-sx/wssecureconversation/200512\"" +
                                    " xmlns:ns16=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
                                    "<wsu:Created>2012-06-08T18:31:44Z</wsu:Created>" +
                                    "<wsu:Expires>2012-06-08T18:36:44Z</wsu:Expires>" +
                                 "</wsu:Timestamp>" +
                                 "<saml2:Assertion ID=\"_883e64a747a5449b83821913a2b189e6\" IssueInstant=\"{0}\" Version=\"2.0\"" +
                                    " xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\"" +
                                    " xmlns:exc14n=\"http://www.w3.org/2001/10/xml-excc14n#\"" +
                                    " xmlns:saml2=\"urn:oasis:names:tc:SAML:2.0:assertion\"" +
                                    " xmlns:xenc=\"http://www.w3.org/2001/04/xmlenc#\"" +
                                    " xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">" +
                                    "<saml2:Issuer Format=\"urn:oasis:names:tc:SAML:1.1:nameid-format:X509SubjectName\">CN=SAML User,OU=SU,O=SAML User,L=Los Angeles,ST=CA,C=US" +
                                    "</saml2:Issuer>" +
                                 "</saml2:Assertion>" +
                              "</wsse:Security>" +

                            "</soap:Header>" +
                            "<soap:Body>" +
                            "</soap:Body>" +
                         "</soap:Envelope>",
                         date.ToUniversalTime().ToString("yyyy-MM-ddThh:mm:ss.fffZ")); 
        doc.LoadXml(soap);

    }
    public static void SignXmlWithCertificate(XmlElement assertion, X509Certificate2 cert)
    {
        SignedXml signedXml = new SignedXml(assertion);
        signedXml.SigningKey = cert.PrivateKey;
        Reference reference = new Reference();
        reference.Uri = "";
        reference.AddTransform(new XmlDsigEnvelopedSignatureTransform());
        signedXml.AddReference(reference);

        KeyInfo keyInfo = new KeyInfo();
        keyInfo.AddClause(new KeyInfoX509Data(cert));

        signedXml.KeyInfo = keyInfo;
        signedXml.ComputeSignature();
        XmlElement xmlsig = signedXml.GetXml();

        assertion.AppendChild(xmlsig);
    }
    public static void CreateSubject(XmlElement xSubject)
    {
        string subject = "<saml2:NameID Format=\"urn:oasis:names:tc:SAML:1.1:nameidformat:X509SubjectName\">UID=WilmaAnderson</saml2:NameID>" +
                          "<saml
Copy after login

The above is the detailed content of How can I digitally sign a SAML assertion and SOAP message in C# using a PFX certificate?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Recommendations
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template