sure...here is the code for the SoapExtension
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.IO;
using System.Xml;
using System.Text;
using System.Security.Cryptography;
namespace SoapExtensionLib
{
// Define a SOAP Extension that encrypts the SOAP request and SOAP
// response for the XML Web service method the SOAP extension is
// applied to.
public class EncryptExtension : SoapExtension
{
Stream oldStream;
Stream newStream;
// Save the Stream representing the SOAP request or SOAP response
into
// a local memory buffer.
public override Stream ChainStream(Stream stream)
{
oldStream = stream;
newStream = new MemoryStream();
return newStream;
}
// When the SOAP extension is accessed for the first time, the XML
Web
// service method it is applied to is accessed to store the file
// name passed in, using the corresponding SoapExtensionAttribute.
public override object GetInitializer(LogicalMethodInfo methodInfo,
SoapExtensionAttribute attribute)
{
return null;
}
// The SOAP extension was configured to run using a configuration
file
// instead of an attribute applied to a specific XML Web service
// method.
public override object GetInitializer(Type WebServiceType)
{
return null;
}
// Receive the file name stored by GetInitializer and store it in a
// member variable for this specific instance.
public override void Initialize(object initializer)
{
return;
}
// If the SoapMessageStage is such that the SoapRequest or
// SoapResponse is still in the SOAP format to be sent or received,
// save it out to a file.
public override void ProcessMessage(SoapMessage message)
{
switch (message.Stage)
{
case SoapMessageStage.BeforeSerialize:
break;
case SoapMessageStage.AfterSerialize:
Encrypt();
break;
case SoapMessageStage.BeforeDeserialize:
Decrypt();
break;
case SoapMessageStage.AfterDeserialize:
break;
default:
throw new Exception("invalid stage");
}
}
public void Encrypt()
{
newStream.Position = 0;
newStream = EncryptHeader(newStream);
Copy(newStream, oldStream);
}
public void Decrypt()
{
Stream unEncryptedStream = DecryptHeader(oldStream);
Copy(unEncryptedStream, newStream);
newStream.Position = 0;
}
public Stream EncryptHeader(Stream streamToEncrypt)
{
streamToEncrypt.Position = 0;
XmlTextReader reader = new XmlTextReader(streamToEncrypt);
XmlDocument dom = new XmlDocument();
dom.Load(reader);
XmlNamespaceManager nsmgr = new
XmlNamespaceManager(dom.NameTable);
nsmgr.AddNamespace("soap",
"
http://schemas.xmlsoap.org/soap/envelope/");
XmlNode node = dom.SelectSingleNode("//soap:Header", nsmgr);
if (node != null)
{
node = node.FirstChild.FirstChild;
node.InnerText = Encrypt(node.InnerText);
}
MemoryStream ms = new MemoryStream();
dom.Save(ms);
ms.Position = 0;
return ms;
}
private MemoryStream DecryptHeader(Stream streamToDecrypt)
{
if (streamToDecrypt.CanSeek)
{
streamToDecrypt.Position = 0;
}
XmlTextReader reader = new XmlTextReader(streamToDecrypt);
XmlDocument dom = new XmlDocument();
dom.Load(reader);
XmlNamespaceManager nsmgr = new
XmlNamespaceManager(dom.NameTable);
nsmgr.AddNamespace("soap",
"
http://schemas.xmlsoap.org/soap/envelope/");
XmlNode node = dom.SelectSingleNode("//soap:Header", nsmgr);
if (node != null)
{
node = node.FirstChild.FirstChild;
node.InnerText = Decrypt(node.InnerText);
}
MemoryStream ms = new MemoryStream();
dom.Save(ms);
ms.Position = 0;
return ms;
}
private Byte[] key = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd,
0xef };
private Byte[] IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd,
0xef };
public string Encrypt(string stringToEncrypt)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] inputByteArray =
Encoding.Unicode.GetBytes(stringToEncrypt);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(key,
IV), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
return Convert.ToBase64String(ms.ToArray());
}
public string Decrypt(string stringToDecrypt)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] inputByteArray =
Convert.FromBase64String(stringToDecrypt);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(key,
IV), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
return Encoding.Unicode.GetString(ms.ToArray());
}
void Copy(Stream from, Stream to)
{
TextReader reader = new StreamReader(from);
TextWriter writer = new StreamWriter(to);
writer.WriteLine(reader.ReadToEnd());
writer.Flush();
}
}
// Create a SoapExtensionAttribute for the SOAP Extension that can be
// applied to an XML Web service method.
[AttributeUsage(AttributeTargets.Method)]
public class EncryptExtensionAttribute : SoapExtensionAttribute
{
private int priority;
public override Type ExtensionType
{
get { return typeof(EncryptExtension); }
}
public override int Priority
{
get { return priority; }
set { priority = value; }
}
}
}
[quoted text, click to view] "Simon Hart" <srhartone@[no spam]yahoo.com> wrote in message