通过生成的WebServiceClient进行WCF Soap基本身份验证



我正试图使用WCF Web服务引用来使用SOAP Web服务。

我已经能够使用System.web.ServicesWeb服务引用在.NET 4.8框架项目中成功地使用SOAP web服务。然而,我需要在.NET核心项目中使用web服务。WCF从WSDL生成的类与.NET框架web服务不同。现在似乎必须使用生成的WebServiceClient与web服务进行交互。

我相信web服务需要基本身份验证,因为我能够在.NET框架项目中使用基本身份验证进行身份验证。

以下是我在尝试执行web服务的某个方法时收到的错误消息。

System.ServiceModel.Security.MessageSecurityException
HResult=0x80131500
Message=The HTTP request is unauthorized with client authentication scheme 'Anonymous'. The authentication header received from the server was ''.
Source=System.Private.ServiceModel

这是我的代码,它实例化客户端并调用方法

var callContext = new CAdxCallContext();
callContext.codeLang = "ENG";
callContext.poolAlias = "BGRTEST";
callContext.requestConfig = "adxwss.trace.on=on&adxwss.trace.size=16384&adonix.trace.on=on&adonix.trace.level=3&adonix.trace.size=8";

var proxy = new CAdxWebServiceXmlCCClient();
proxy.ClientCredentials.UserName.UserName = "username";
proxy.ClientCredentials.UserName.Password = "password";
string _InputXml = "<PARAM>" +
"<GRP ID= "GRP1">" +
"<FLD NAME = "ITMREF">" + 100001 + "</FLD>" +
"</GRP>" +
"</PARAM>";
try
{
var response = proxy.run(callContext, "BGR_SIEPRO", _InputXml);
}
finally
{
proxy.Close();
}

我的WCF服务连接:WCF连接的服务屏幕截图

自动生成的WCF WebServiceClient:https://github.com/abiddle-bgr/Test/blob/main/CAdxWebServiceXmlCCClient.cs

我最终不得不通过创建一个自定义端点并将其作为自定义端点行为添加到代理来手动注入头。

var proxy = new CAdxWebServiceXmlCCClient();
proxy.Endpoint.EndpointBehaviors.Add(new CustomEndpoint());
public class ClientMessageInspector : IClientMessageInspector
{
public void AfterReceiveReply(ref Message reply, object correlationState)
{
// Nothing Here
Console.Write(reply.ToString());
}
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
HttpRequestMessageProperty httpRequestProperty = new HttpRequestMessageProperty();
httpRequestProperty.Headers[HttpRequestHeader.Authorization] = "Basic " +
Convert.ToBase64String(Encoding.ASCII.GetBytes("USERNAME" + ":" +
"PASSWORD"));
request.Properties.Add(HttpRequestMessageProperty.Name, httpRequestProperty);
return null;
}
}
public class CustomEndpoint : IEndpointBehavior
{
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
// Nothing here
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
clientRuntime.ClientMessageInspectors.Add(new ClientMessageInspector());
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
// Nothing here
}
public void Validate(ServiceEndpoint endpoint)
{
// Nothing here
}
}

您设置了安全传输模式吗?类似于:WCF客户端中的基本身份验证。

<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>

在代码中,将代理类设置为允许模拟

proxy.ClientCredentials.Windows.AllowedImpersonationLevel =    
System.Security.Principal.TokenImpersonationLevel.Impersonation;

你可以看看这篇文章。

最新更新