GetStringAsync завершается ошибкой, если привязка IIS установлена на определенный IP

#c# #iis #.net-core

Вопрос:

У меня проблема с тем, что мое приложение взаимодействует с веб-сайтом, но только тогда, когда привязки настроены на использование определенного IP-адреса (т. Е. 172.16.9.86). Если я оставлю привязку как » * » (все неназначенные) , приложение будет работать правильно.

введите описание изображения здесь

Приложение обращается к веб-сайту с помощью HttpClient (.NET Core 3.1) примерно так:

 try
{
    System.Net.ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
    responseBody = await client.GetStringAsync("https://myServer.myDomain.com/SecureKeyTest/rdTemplate/rdGetSecureKey.aspx?Username=admin");
                
    Debug.WriteLine(responseBody);
}
catch (HttpRequestException e)
{
    Debug.WriteLine("Message :{0} ", e.Message);
}
 

Я могу взять тот же URL-адрес и вставить его в Chrome, и он работает для извлечения ключа безопасности, даже если привязка по-прежнему установлена на определенный IP-адрес, поэтому я не понимаю, чем HttpClient вызов отличается от вызова из Chrome.

Я просмотрел сотни сообщений, которые нашел по этой проблеме, и почти все утверждают, что добавление SecurityProtocol настроек должно решить эту проблему, но этого не произошло. Сертификат, используемый для этого веб-сайта, является полностью зарегистрированным сертификатом компании, а не сгенерированным самостоятельно.

ИЗМЕНИТЬ: забыл добавить сообщение об исключении, которое я получаю:

     The SSL connection could not be established, see inner exception.System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.. 
---> System.Net.Sockets.SocketException (10054): An existing connection was forcibly closed by the remote host. 
--- End of inner exception stack trace 
--- at System.Net.FixedSizeReader.ReadPacketAsync(Stream transport, AsyncProtocolRequest request) at System.Net.Security.SslStream.ThrowIfExceptional() at System.Net.Security.SslStream.InternalEndProcessAuthentication(LazyAsyncResult lazyResult) at System.Net.Security.SslStream.EndProcessAuthentication(IAsyncResult result) at System.Net.Security.SslStream.EndAuthenticateAsClient(IAsyncResult asyncResult) at System.Net.Security.SslStream.<>c.<AuthenticateAsClientAsync>b__65_1(IAsyncResult iar) at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization) 
--- End of stack trace from previous location where exception was thrown --- at System.Net.Http.ConnectHelper.EstablishSslConnectionAsyncCore(Stream stream, SslClientAuthenticationOptions sslOptions, CancellationToken cancellationToken)
 

Комментарии:

1. Имеет ли какое-либо значение, если вы используете IP-адрес вместо имени хоста с помощью HttpClient? Кстати, я надеюсь, что вы не предоставляете функции администратора без разрешения.

2. @Crowcoder Тот же результат с использованием IP-адреса.

Ответ №1:

Просто потому, что у вас нет соответствующего сопоставления сертификатов на основе IP-адресов для этого IP-адреса в Windows HTTP API,

https://docs.jexusmanager.com/tutorials/https-binding.html#ip-based-bindings

Комментарии:

1. Можно ли использовать эту программу с полным IIS (не IIS Express)? Когда я открываю его, я вижу только те параметры, которые относятся к IIS Express.

2. @BrianKE вы можете запустить команду netsh в командной строке для анализа сопоставлений или запустить Jexus Manager от имени администратора, если хотите проверить параметры IIS.