Я добавляю SSL-безопасность с проверкой подлинности Windows в ранее незащищенное приложение службы WCF, размещенное в IIS. К моему удивлению, я обнаружил, что две конечные точки службы уже использовали привязку с транспортом и безопасностью Windows. Это сбивает с толку, поскольку клиентские приложения, использующие эту службу, не настроены для использования безопасности транспорта или учетных данных Windows. Вот конфигурация сервиса:
<binding name="LargeBuffer" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
<security mode="Transport">
<transport clientCredentialType="Windows" />
</security>
</binding>
...
<service behaviorConfiguration="WebServices.GCServiceBehavior"
name="WebServices.GCService">
<endpoint address="" binding="basicHttpBinding" name="GCSecuredEndpoint"
bindingName="largeBuffer" contract="WebServices.IGCService" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
Когда я использую Visual Studio для создания прокси-сервера и конфигурации клиента, он создает следующее:
<binding name="GCSecuredEndpoint" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
...
<endpoint address="http://devservices.mysite.com/GCService/GCService.svc"
binding="basicHttpBinding" bindingConfiguration="GCSecuredEndpoint"
contract="GCSvc.IGCService" name="GCSecuredEndpoint" />
Обратите внимание, что это режим безопасности = "None" и Transport ClientCredentialType имеет значение None вместо Windows. Когда я вызываю метод в GCService, он успешен. Я ожидал, что он сначала пожалуется, что я пытаюсь получить доступ через http вместо https, но это не так. Затем я ожидал бы, что он не аутентифицируется или не будет жаловаться на то, что конечная точка клиента не соответствует службе с точки зрения аутентификации, но это не так.
У меня есть еще одна служба в том же приложении, которое я только что настроил с безопасностью транспорта / Windows, только без всего буфера / квоты чтения. Во-первых, когда я создаю клиентский прокси / конфигурацию в VS для этой службы, он автоматически использует адрес https, безопасность транспорта и аутентификацию Windows. Если я вручную изменю его, чтобы использовать None для обоих, как указано выше, вызов одного из методов службы не будет успешным, как и ожидалось. Почему GCService выше работает?