. net ядро, вызывающее службу wcf - SecurityAccessDeniedException: маркер безопасности не может быть аутентифицирован или авторизован - PullRequest
3 голосов
/ 25 марта 2020

Получение следующего сообщения об ошибке независимо от basicHttpBinding или wsHttpBinding in. net core 3.1:

 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();

я не после решения но некоторые указатели на то, что я делаю здесь неправильно или что еще я должен попытаться выяснить?

Ответы [ 2 ]

0 голосов
/ 29 марта 2020

Я бы создал ChannelFactory вместо получения фабрики каналов от клиента в случае, если клиент кэширует что-либо:

var channelFactory = new ChannelFactory<SoapInterfaceType>(binding, remoteAddress);
channelFactory.Credentials.UserName.UserName = "";
channelFactory.Credentials.UserName.Password = "";
var channel = channelFactory.CreateChannel();
0 голосов
/ 26 марта 2020

Тип привязки и тип учетных данных должны соответствовать конфигурации сервера.
Я предлагаю создать клиентский прокси-сервер для вызова удаленной службы.
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);

Все, на что мы должны обратить внимание, - это то, что тип привязки и тип безопасности должны соответствовать типу привязки на сервере. Поэтому первое, что важно, это то, что мы должны выяснить конфигурацию сервера и применить ее на стороне клиента.
Не стесняйтесь сообщить мне, если проблема все еще существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...