92 lines
3.9 KiB
C#
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;
|
|
|
|
}
|
|
}
|
|
}
|