在.net core 3.1中,无论basicHttpBinding还是wsHttpBinding都收到以下错误消息:
SecurityAccessDeniedException: The security token could not be authenticated or authorized
System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(Message reply, MessageFault fault, string action, MessageVersion version, FaultConverter faultConverter)
System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ref ProxyRpc rpc)
System.ServiceModel.Channels.ServiceChannel.EndCall(string action, object[] outs, IAsyncResult result)
System.ServiceModel.Channels.ServiceChannelProxy+TaskCreator+<>c__DisplayClass1_0.<CreateGenericTask>b__0(IAsyncResult asyncResult)
这是代码:
var binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
var address = new System.ServiceModel.EndpointAddress("soapendpoint");
var client = new Client(binding, address);
var cf = client.ChannelFactory;
cf.Credentials.UserName.UserName = username;
cf.Credentials.UserName.Password = password;
var channel = cf.CreateChannel();
var response = channel.GetPatientAsync();
我不是在寻求解决方案,而是在这里我做错了什么或应该尝试找出其他什么的一些指示?
答案 0 :(得分:0)
绑定类型和凭据类型应与服务器的配置一致。
我建议您生成一个客户端代理来调用远程服务。
https://docs.microsoft.com/en-us/dotnet/core/additional-tools/wcf-web-service-reference-guide
使用此工具,我们可以生成代理并获取与服务器配置相对应的正确配置。之后,我们可以调用该服务。
ServiceReference1.ServiceClient client = new ServiceReference1.ServiceClient();
var result = client.TestAsync();
Console.WriteLine(result.Result);
由于该工具还在客户端生成服务合同,因此我们也可以根据Reference.cs
文件中生成的服务配置来更改调用远程服务的方式。
BasicHttpBinding binding = new BasicHttpBinding();
binding.Security.Mode = BasicHttpSecurityMode.None;
Uri uri = new Uri("http://10.157.13.69:21011");
ChannelFactory<IService> channelFactory = new ChannelFactory<IService>(binding, new EndpointAddress(uri));
IService service = channelFactory.CreateChannel();
var result1 = service.TestAsync();
Console.WriteLine(result1.Result);
我们需要注意的是绑定的类型和安全性类型应与服务器上的类型一致。因此,首要的事情是我们应该找出服务器配置并将其应用于客户端。
如果问题仍然存在,请随时告诉我。
答案 1 :(得分:0)
如果客户端缓存了任何内容,我将创建一个ChannelFactory
而不是从客户端获取频道工厂:
var channelFactory = new ChannelFactory<SoapInterfaceType>(binding, remoteAddress);
channelFactory.Credentials.UserName.UserName = "";
channelFactory.Credentials.UserName.Password = "";
var channel = channelFactory.CreateChannel();
答案 2 :(得分:0)
发现错误的原因是因为 WCF 服务具有 WS 策略,而其中两个策略在 .NET Core 中不受支持。一个是 sp:encryptedsecuritytoken 另一个是 sp:trust