HTTP-запрос неавторизован со схемой аутентификации клиента «Анонимный» Dynamics NAV

У меня проблема с приложением .net core (3.1), пытающимся использовать WS (SOAP) с сервера Dynamics Nav. (на территории). Когда я нахожусь в режиме отладки, все работает нормально, но когда я развернул приложение на локальном сервере IIS, я продолжаю получать сообщение «HTTP-запрос неавторизован со схемой аутентификации клиента «Анонимный». Заголовок аутентификации, полученный с сервера, был «oRswGaADCgEAoxIEEAEA=, Вести переговоры'."

Инициализация клиента

      private async Task<TXSiteUser_PortClient> GetInstanceAsync()
{
            EndpointAddress endpointAddress = new EndpointAddress(serviceUrl);
            BasicHttpBinding basicHttpBinding = new BasicHttpBinding()
            {
                MaxReceivedMessageSize = int.MaxValue,
                MaxBufferSize = int.MaxValue,
                OpenTimeout = TimeSpan.MaxValue,
                CloseTimeout = TimeSpan.MaxValue,
                ReceiveTimeout = TimeSpan.MaxValue,
                SendTimeout = TimeSpan.MaxValue
            };

            return await Task.Run(() => new TXSiteUser_PortClient(basicHttpBinding, endpointAddress));
        }

Пример обращения к WS

      var client = await GetInstanceAsync();

var user = await client.ReadAsync(new Read { Id = id });

await client.CloseAsync();

return user.TXSiteUser;

Сервер Dynamics имеет тип учетных данных "Windows". А ниже web.config

      <configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath=".\ArtoilPortal.exe" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
    </system.webServer>
  </location>
</configuration>

Странно то, что когда я нахожусь в режиме отладки и тестирую конечные точки из Swagger, все работает нормально. Кроме того, каждый раз, когда я пытаюсь использовать почтальона, я получаю 401, независимо от типа аутентификации (Basic,NTML). Также я пытался добавить

      basicHttpBinding.Security.Mode = BasicHttpSecurityMode.Transport;
basicHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
var username = _appSettings.NAVCredentials.UserName;
var password = _appSettings.NAVCredentials.Password;

и расширил метод PortClient следующим образом

              public TXSiteUser_PortClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress, string userName, string password) : 
                base(binding, remoteAddress)
        {

            this.ChannelFactory.Credentials.UserName.UserName = userName;
            this.ChannelFactory.Credentials.UserName.Password = password;
            ConfigureEndpoint(this.Endpoint, this.ClientCredentials);
        }

без везения

1 ответ

удалось исправить ошибки. Во-первых, код инициализации клиента был исправлен с использованием «TransportCredentialOnly» вместо «Transport».

       basicHttpBinding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;

Режим TransportCredentialOnly используется, когда SSL не настроен для служб SOAP на сервере Dynamics NAV.

И работающий у меня вариант метода "PortClient" выглядит так:

      public TXSiteUser_PortClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress, string userName, string password) : 
            base(binding, remoteAddress)
    {
        this.ClientCredentials.Windows.ClientCredential.UserName = userName;
        this.ClientCredentials.Windows.ClientCredential.Password = password;
        this.ClientCredentials.Windows.ClientCredential.Domain = "";
        ConfigureEndpoint(this.Endpoint, this.ClientCredentials);
    }

В исходном посте я устанавливал

       this.ChannelFactory.Credentials.UserName.UserName = userName;

Где это должно было быть

       this.ClientCredentials.Windows.ClientCredential.UserName = userName;

Надеюсь, это поможет кому-то в какой-то момент

Другие вопросы по тегам