kreta/Kreta.EESZTInterface/STS/CreateSoap.cs
2024-03-13 00:33:46 +01:00

92 lines
3.9 KiB
C#

using System;
using System.IO;
using System.Security.Cryptography.X509Certificates;
using System.Xml;
namespace Kreta.EESZTInterface.STS
{
partial class CreateSoap
{
public static XmlDocument CreateX509Soap(X509Certificate2 oamCert, X509Certificate2 cert)
{
XmlElement elem;
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.PreserveWhitespace = true;
string idBody = "Id-" + Guid.NewGuid().ToString().Replace("-", "");
string idTs = "TS-" + Guid.NewGuid().ToString().Replace("-", "");
string idX509 = "X509-" + Guid.NewGuid().ToString().Replace("-", "");
string idOamCert = "OAM-" + Guid.NewGuid().ToString().Replace("-", "");
XmlElement root = xmlDoc.CreateElement("soap", "Envelope", Namespaces.soap12Ns);
root.SetAttribute("xmlns:ns", Namespaces.nsNs);
xmlDoc.AppendChild(root);
XmlElement head = xmlDoc.CreateElement("soap", "Header", Namespaces.soap12Ns);
root.AppendChild(head);
XmlElement sec = xmlDoc.CreateElement("wsse", "Security", Namespaces.wsseNs);
sec.SetAttribute("xmlns:wsu", Namespaces.wsuNs);
head.AppendChild(sec);
XmlElement binary = xmlDoc.CreateElement("wsse", "BinarySecurityToken", Namespaces.wsseNs);
binary.SetAttribute("Id", Namespaces.wsuNs, idOamCert);
binary.SetAttribute("ValueType", STSValues.x509v3Value);
binary.SetAttribute("EncodingType", STSValues.base64BinaryValue);
binary.InnerText = CertificateHelper.CertToBase64String(oamCert);
sec.AppendChild(binary);
binary = xmlDoc.CreateElement("wsse", "BinarySecurityToken", Namespaces.wsseNs);
binary.SetAttribute("Id", Namespaces.wsuNs, idX509);
binary.SetAttribute("ValueType", STSValues.x509v3Value);
binary.SetAttribute("EncodingType", STSValues.base64BinaryValue);
binary.InnerText = CertificateHelper.CertToBase64String(cert);
sec.AppendChild(binary);
XmlElement timestamp = xmlDoc.CreateElement("wsu", "Timestamp", Namespaces.wsuNs);
timestamp.SetAttribute("Id", Namespaces.wsuNs, idTs);
sec.AppendChild(timestamp);
elem = xmlDoc.CreateElement("wsu", "Created", Namespaces.wsuNs);
elem.InnerText = DateTime.Now.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ");
timestamp.AppendChild(elem);
elem = xmlDoc.CreateElement("wsu", "Expires", Namespaces.wsuNs);
elem.InnerText = DateTime.Now.AddHours(2).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ");
timestamp.AppendChild(elem);
XmlElement body = xmlDoc.CreateElement("soap", "Body", Namespaces.soap12Ns);
body.SetAttribute("xmlns:wsu", Namespaces.wsuNs);
body.SetAttribute("Id", Namespaces.wsuNs, idBody);
xmlDoc.DocumentElement.AppendChild(body);
XmlElement secToken = xmlDoc.CreateElement("ns", "RequestSecurityToken", Namespaces.nsNs);
body.AppendChild(secToken);
elem = xmlDoc.CreateElement("ns", "RequestType", Namespaces.nsNs);
elem.InnerText = STSValues.issueValue;
secToken.AppendChild(elem);
elem = xmlDoc.CreateElement("ns", "TokenType", Namespaces.nsNs);
elem.InnerText = STSValues.samlv2Value;
secToken.AppendChild(elem);
var mem = new MemoryStream();
xmlDoc.Save(mem);
mem.Seek(0, SeekOrigin.Begin);
xmlDoc = new XmlDocument
{
PreserveWhitespace = true
};
xmlDoc.Load(mem);
xmlDoc = SignHelper.SignMessage(xmlDoc, cert, "#" + idBody, "#" + idTs, "#" + idX509);
xmlDoc = EncryptHelper.EncryptMessage(xmlDoc, oamCert, "#" + idBody, "#" + idTs, "#" + idOamCert);
return xmlDoc;
}
}
}