public void WhenAuthenticateUserWithSamlTokenThenNoExceptionIsThrown() { string outerXml; XmlDocument xmlDocument; SoapEnvelope soapEnvelope; var beIdCardConnector = new BeIdCardConnector(); var context = beIdCardConnector.EstablishContext(); var readers = beIdCardConnector.GetReaders(); var connection = beIdCardConnector.Connect(readers.First()); var ehealthSamlTokenRequestBuilder = new EhealthSamlTokenRequestBuilder(); // 1. Construct SAML token. var certificate = beIdCardConnector.GetAuthenticateCertificate(); var tlvParser = new TlvParser(); var identityPayload = beIdCardConnector.GetIdentity(); var addressPayload = beIdCardConnector.GetAddress(); var identity = tlvParser.Parse <Identity>(identityPayload); var address = tlvParser.Parse <Address>(addressPayload); ehealthSamlTokenRequestBuilder.New(certificate).SetIdentity(identity); soapEnvelope = ehealthSamlTokenRequestBuilder.Build(); var signSamlToken = new SignSamlToken(); // 2. Build signature. var signatureNode = signSamlToken.BuildSignatureWithEid(soapEnvelope, "0726", beIdCardConnector); soapEnvelope.Header.Security.Signature = signatureNode; var soapSerializer = new SoapMessageSerializer(); // 3. Serialize the request. xmlDocument = soapSerializer.Serialize(soapEnvelope); outerXml = xmlDocument.OuterXml; beIdCardConnector.Dispose(); var nsmgr = new XmlNamespaceManager(xmlDocument.NameTable); nsmgr.AddNamespace(Common.Saml.Constants.XmlPrefixes.Ds, Common.Saml.Constants.XmlNamespaces.Ds); nsmgr.AddNamespace(Common.Saml.Constants.XmlPrefixes.Wsse, Common.Saml.Constants.XmlNamespaces.Wsse); var signatureValue = xmlDocument.SelectSingleNode("//ds:SignatureValue", nsmgr).InnerText; // 5. Check signature value. var binarySecurityToken = xmlDocument.SelectSingleNode("//wsse:BinarySecurityToken", nsmgr).InnerText; var signedInfo = xmlDocument.SelectSingleNode("//ds:SignedInfo", nsmgr).OuterXml; var serializer = new XmlDsigExcC14NTransform(); var doc = new XmlDocument(); doc.LoadXml(signedInfo); serializer.LoadInput(doc); var c14n = new StreamReader((Stream)serializer.GetOutput(typeof(Stream))).ReadToEnd(); var signedInfoPayload = Encoding.UTF8.GetBytes(c14n); var b64 = Convert.ToBase64String(signedInfoPayload); byte[] hashResult = null; using (var sha = new SHA1CryptoServiceProvider()) { hashResult = sha.ComputeHash(signedInfoPayload); } var b64Hash = Convert.ToBase64String(hashResult); var signature = System.Convert.FromBase64String(signatureValue); var x509Certificate = new X509Certificate2(Convert.FromBase64String(binarySecurityToken)); var publicKey = x509Certificate.GetRSAPublicKey(); var isSignatureCorrect = publicKey.VerifyHash(hashResult, signature, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1); Assert.True(isSignatureCorrect); }
public SoapSignature BuildSignatureWithEid(SoapEnvelope soapEnvelope, string pin, IBeIdCardConnector connector) { if (soapEnvelope == null) { throw new ArgumentNullException(nameof(soapEnvelope)); } if (string.IsNullOrWhiteSpace(pin)) { throw new ArgumentNullException(nameof(pin)); } if (connector == null) { throw new ArgumentNullException(nameof(connector)); } var serializer = new SoapMessageSerializer(); // Serialize into XML. var xmlDocument = serializer.Serialize(soapEnvelope); string xml = null; using (var strWriter = new StringWriter()) { using (var xmlTextWriter = XmlWriter.Create(strWriter)) { xmlDocument.WriteTo(xmlTextWriter); xmlTextWriter.Flush(); xml = strWriter.GetStringBuilder().ToString(); } } var nsmgr = new XmlNamespaceManager(xmlDocument.NameTable); // 1. Construct the SignedInfo. nsmgr.AddNamespace(Common.Saml.Constants.XmlPrefixes.Wsu, Common.Saml.Constants.XmlNamespaces.Wsu); nsmgr.AddNamespace(Common.Saml.Constants.XmlPrefixes.SoapEnv, Common.Saml.Constants.XmlNamespaces.SoapEnvelope); nsmgr.AddNamespace(Common.Saml.Constants.XmlPrefixes.Wsse, Common.Saml.Constants.XmlNamespaces.Wsse); nsmgr.AddNamespace(Common.Saml.Constants.XmlPrefixes.Ds, Common.Saml.Constants.XmlNamespaces.Ds); var bodyTokenNode = xmlDocument.SelectSingleNode($"//{Common.Saml.Constants.XmlPrefixes.SoapEnv}:Body", nsmgr); var timeStampNode = xmlDocument.SelectSingleNode($"//{Common.Saml.Constants.XmlPrefixes.Wsu}:Timestamp", nsmgr); var binaryTokenNode = xmlDocument.SelectSingleNode($"//{Common.Saml.Constants.XmlPrefixes.Wsse}:BinarySecurityToken", nsmgr); var timeStampId = timeStampNode.Attributes[$"{Common.Saml.Constants.XmlPrefixes.Wsu}:Id"].Value; var binaryTokenId = binaryTokenNode.Attributes[$"{Common.Saml.Constants.XmlPrefixes.Wsu}:Id"].Value; var bodyTokenId = bodyTokenNode.Attributes[$"{Common.Saml.Constants.XmlPrefixes.Wsu}:Id"].Value; var signatureNode = Canonilize(xml, new[] { timeStampId, binaryTokenId, bodyTokenId }); var c14Serializer = new XmlDsigExcC14NTransform(); // 2. Compute the signature value. var c14Doc = new XmlDocument(); c14Doc.LoadXml(signatureNode.FirstChild.OuterXml); c14Serializer.LoadInput(c14Doc); var c14n = new StreamReader((Stream)c14Serializer.GetOutput(typeof(Stream))).ReadToEnd(); var signedInfoPayload = Encoding.UTF8.GetBytes(c14n); var b64 = Convert.ToBase64String(signedInfoPayload); byte[] hashResult = null; using (var sha = new SHA1CryptoServiceProvider()) { hashResult = sha.ComputeHash(signedInfoPayload); } var b64Hash = Convert.ToBase64String(hashResult); byte[] signatureValue = null; // 3. Construct the result. var certificate = connector.GetAuthenticateCertificate(); var applicationName = "medikit"; var digestAlgo = BeIDDigest.Sha1; var fileType = FileType.NonRepudiationCertificate; var requireSecureReader = false; signatureValue = connector.SignWithNoneRepudationCertificate(hashResult, digestAlgo, requireSecureReader, applicationName, pin); var signatureValueB64 = Convert.ToBase64String(signatureValue); var soapKeyInfo = new SoapKeyInfo(GenerateId("KI"), GenerateId("STR"), $"#{binaryTokenId}"); var result = new SoapSignature(GenerateId("SIG"), signatureValueB64, soapKeyInfo); var referenceNodes = signatureNode.SelectNodes($"//{Common.Saml.Constants.XmlPrefixes.Ds}:Reference", nsmgr); foreach (XmlNode referenceNode in referenceNodes) { var uri = referenceNode.Attributes["URI"].Value; var digestValueNode = referenceNode.SelectSingleNode($"{Common.Saml.Constants.XmlPrefixes.Ds}:DigestValue", nsmgr); result.References.Add(new SoapReference(uri, digestValueNode.InnerText)); } return(result); }
static void TestASyncMessage(int count) { Console.Write("Please input serialize type:(0:none, 1:bin, 2:xml, 3:json, 4: simplebin, 5: customer)"); string strSerializeType = Console.ReadLine(); int serializeType = 0; int.TryParse(strSerializeType, out serializeType); ISerialize <SoapMessage> iSendMessageSerializer = null; ISerialize <DataContainer> iReturnDataSerializer = new NTCPMessage.Serialize.JsonSerializer <DataContainer>(); switch (serializeType) { case 0: strSerializeType = "none"; break; case 1: strSerializeType = "bin"; iSendMessageSerializer = new BinSerializer <SoapMessage>(); break; case 2: strSerializeType = "xml"; iSendMessageSerializer = new XMLSerializer <SoapMessage>(); break; case 3: strSerializeType = "json"; iSendMessageSerializer = new NTCPMessage.Serialize.JsonSerializer <SoapMessage>(); break; case 4: iSendMessageSerializer = new SimpleBinSerializer <SoapMessage>(); strSerializeType = "simplebin"; break; case 5: iSendMessageSerializer = new SoapMessageSerializer(); strSerializeType = "customer"; break; default: serializeType = 0; strSerializeType = "none"; break; } Console.WriteLine("Serialize type is {0}", strSerializeType); SingleConnectionCable client = new SingleConnectionCable(new IPEndPoint(IPAddress.Parse(_IPAddress), 2500), 7); client.ReceiveEventHandler += new EventHandler <ReceiveEventArgs>(ReceiveEventHandler); client.ErrorEventHandler += new EventHandler <ErrorEventArgs>(ErrorEventHandler); client.RemoteDisconnected += new EventHandler <DisconnectEventArgs>(DisconnectEventHandler); try { client.Connect(); Stopwatch sw = new Stopwatch(); Console.WriteLine("Test async message"); if (serializeType == 0) { sw.Start(); //---------基本类型 字符串明文消息发送----------- try { for (int i = 0; i < count; i++) { var buffer = Encoding.UTF8.GetBytes(DateTime.Now.ToString()); var resultBytes = client.SyncSend(10, buffer); var str = Encoding.UTF8.GetString(resultBytes); Console.WriteLine(str); } } catch (Exception e) { Console.WriteLine(e); } sw.Stop(); Console.WriteLine("Finished. Elapse : {0} ms", sw.ElapsedMilliseconds); } else { ///标准soap消息发送 var obj = new { spid = 1, ValueType = 9999 }; string msg = JsonConvert.SerializeObject(obj); SoapMessage testMessage = new SoapMessage() { Head = "student", Body = msg }; sw.Start(); try { //模拟并发 Task[] tks = new Task[count]; for (int i = 0; i < count; i++) { //client.AsyncSend((UInt32)(20 + serializeType), // ref testMessage, // iSendMessageSerializer); var t = Task <object> .Factory.StartNew(() => { var repResult = client.SyncSend((UInt32)(20 + serializeType), testMessage, 1000, iSendMessageSerializer); return(repResult); }); tks[i] = t; //if (null != repResult) //{ // Console.WriteLine("from server response :{0}", repResult.Status); //} } Task.WaitAll(tks); } catch (Exception e) { Console.WriteLine(e); } //else //{ // try // { // for (int i = 0; i < count; i++) // { // //client.AsyncSend((UInt32)(20 + serializeType), testMessage, iSerializer); // var repResult = client.SyncSend((UInt32)(20 + serializeType),ref testMessage, 88888888, iSendMessageSerializer, iReturnDataSerializer); // if (null != repResult) // { // Console.WriteLine("from server response :{0}", repResult.Status); // } // } // } // catch (Exception e) // { // Console.WriteLine(e); // } //} sw.Stop(); Console.WriteLine("Finished. Elapse : {0} ms", sw.ElapsedMilliseconds); } } catch (Exception e) { Console.WriteLine(e); } finally { client.Close(); } }