Запрос метаданных требует аутентификации в WCF, хотя страница описания сервиса не
Я настроил службу WCF, требующую проверки подлинности NTLM, используя следующую конфигурацию:
<system.serviceModel>
<bindings>
<customBinding>
<binding name="BinarySecurityBinding">
<binaryMessageEncoding/>
<httpTransport authenticationScheme="Ntlm"/>
</binding>
</customBinding>
</bindings>
<services>
<service name="Services.LogisticsServices" behaviorConfiguration="ServiceBehavior">
<endpoint address="" binding="customBinding" bindingConfiguration="BinarySecurityBinding" contract="Services.ILogisticsServices" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
Я сделал это так, чтобы приложения, использующие веб-службу, были вынуждены войти в систему, потому что все операции моей службы используют олицетворение ([OperationBehavior(Impersonation = ImpersonationOption.Required)]
).
В IIS 7 я включил анонимную аутентификацию и проверку подлинности Windows.
Когда я посещаю http://test.server/LogisticsServices.svc
, где размещается описанная выше служба, я могу видеть страницу описания службы по умолчанию анонимно. Тем не менее, когда Visual Studio пытается получить доступ http://test.server/LogisticsServices.svc/$metadata
для создания клиентского прокси-сервера сервер отвечает HTTP-кодом 401 и ожидает аутентификацию. Я не только ожидал, что метаданные будут доступны анонимно, но, кроме того, сервер не принимает учетные данные, которые я ему предоставляю (хотя я точно знаю, что они верны).
Тестируя другую конфигурацию, я попытался удалить authenticationScheme
из транспорта моей привязки, просто чтобы иметь возможность генерировать клиентский прокси, но это приводит к исключению, потому что операции службы требуют олицетворения ([OperationBehavior(Impersonation = ImpersonationOption.Required)]
).
Чего мне не хватает в конфигурации моего сервиса, чтобы метаданные сервиса были доступны анонимно? Я также открыт для предложений, если я подхожу ко всему неправильно.
2 ответа
Вот похожее обсуждение:
Получение исключения параметра безопасности при доступе к службе WCF
Один из способов обойти это - не использовать автоматически сгенерированные прокси.
В тех случаях, когда мы контролируем как сервер, так и клиента, мы обнаружили, что гораздо эффективнее избегать использования автоматически созданных прокси.
Скринкаст о том, как это сделать, можно найти здесь: http://www.dnrtv.com/default.aspx?showNum=122
Вы можете попробовать императив вместо декларативной модели, см.: http://msdn.microsoft.com/en-us/library/ms730088.aspx