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;
Надеюсь, это поможет кому-то в какой-то момент