WCF调用JAVA webservice 采用usernametoken header问题
现在建了一个WCF服务,对方采用usernametoken验证没有加密,调用时候总是提示
"An error was discovered processing the <wsse:Security> header”
我在客户端也加入了
client.ClientCredentials.UserName.UserName = "admin";
client.ClientCredentials.UserName.Password = "123456";
求解!!!!!急!!!!!! wcf webservice
[解决办法]
应该通过 SoapHeader。
[解决办法]
这个问题比较复杂。我给你解决吧!需要你对WebService理解稍微深入一点,这是因为Java采用usernametoken验证,C#调用的时候并不会在SoapHeader里包含身份信息,需要自己实现
之前也是遇到这个问题,网上很多讲怎么解决这个问题,实际上没有一个能解决的!我给你直接上代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ServiceModel.Description;
using System.ServiceModel;
using System.ServiceModel.Security;
using System.Text;
using System.Security.Cryptography;
using System.ServiceModel.Dispatcher;
using System.ServiceModel.Channels;
using System.Xml;
using System.ServiceModel.Configuration;
using System.Xml.Serialization;
using System.IO;
using System.Runtime.Serialization;
namespace JavaWebServiceCaller
{
public class CustomClientMessageInspector : IDispatchMessageInspector, IClientMessageInspector
{
public string UserName { get; private set; }
public string Password { get; private set; }
public CustomClientMessageInspector()
{
}
public CustomClientMessageInspector(string userName, string password)
{
UserName = userName;
Password = password;
}
#region Message Inspector of the Service
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
return null;
}
public void BeforeSendReply(ref Message reply, object correlationState)
{
}
#endregion
#region Message Inspector of the Consumer
public void AfterReceiveReply(ref Message reply, object correlationState)
{
}
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
MessageHeader header = new CustomMessageHeader(UserName, Password);
request.Headers.Add(header);
return null;
}
#endregion
}
class CustomMessageHeader : MessageHeader
{
private const string PREFIX_SEC = "wsse";
private const string PREFIX_SOAP = "soapenv";
private const string NAMESPACE_SEC = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
private const string NAMESPACE_SOAP = "http://schemas.xmlsoap.org/soap/envelope/";
public string UserName { get; private set; }
public string Password { get; private set; }
public CustomMessageHeader(string userName, string password)
{
UserName = userName;
Password = password;
}
protected override void OnWriteHeaderContents(XmlDictionaryWriter writer, MessageVersion messageVersion)
{
base.OnWriteStartHeader(writer, messageVersion);
}
protected override void OnWriteStartHeader(System.Xml.XmlDictionaryWriter writer, MessageVersion messageVersion)
{
writer.WriteStartElement(PREFIX_SOAP, "Header", NAMESPACE_SOAP);
//Security
writer.WriteStartElement(PREFIX_SEC, "Security", NAMESPACE_SEC);
writer.WriteAttributeString(PREFIX_SOAP, "mustUnderstand", NAMESPACE_SOAP, "1");
writer.WriteXmlnsAttribute(PREFIX_SEC, NAMESPACE_SEC);
writer.WriteXmlnsAttribute(PREFIX_SOAP, NAMESPACE_SOAP);
//UsernameToken
writer.WriteStartElement(PREFIX_SEC, "UsernameToken", NAMESPACE_SEC);
//Username
writer.WriteElementString(PREFIX_SEC, "Username", NAMESPACE_SEC, UserName);
//Password
writer.WriteStartElement(PREFIX_SEC, "Password", NAMESPACE_SEC);
writer.WriteAttributeString("Type", @"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
writer.WriteValue(Password);
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndElement();
}
public override string Name
{
get { return "Security"; }
}
public override string Namespace
{
get { return NAMESPACE_SEC; }
}
}
public class CustomBehavior : Attribute, IEndpointBehavior
{
#region IEndpointBehavior Members
public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime)
{
var clientCredentials = endpoint.Behaviors.Find<ClientCredentials>();
if (clientCredentials != null)
{
var inspector = new CustomClientMessageInspector(clientCredentials.UserName.UserName, clientCredentials.UserName.Password);
clientRuntime.MessageInspectors.Add(inspector);
}
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher)
{
//ChannelDispatcher channelDispatcher = endpointDispatcher.ChannelDispatcher;
//if (channelDispatcher != null)
//{
// foreach (EndpointDispatcher ed in channelDispatcher.Endpoints)
// {
// var inspector = new CustomClientMessageInspector();
// ed.DispatchRuntime.MessageInspectors.Add(inspector);
// }
//}
}
public void Validate(ServiceEndpoint endpoint)
{
}
#endregion
}
public class CustomBehaviorExtensionElement : BehaviorExtensionElement
{
protected override object CreateBehavior()
{
return new CustomBehavior();
}
public override Type BehaviorType
{
get
{
return typeof(CustomBehavior);
}
}
}
}