Запрос метаданных требует аутентификации в 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 ответа

Один из способов обойти это - не использовать автоматически сгенерированные прокси.

В тех случаях, когда мы контролируем как сервер, так и клиента, мы обнаружили, что гораздо эффективнее избегать использования автоматически созданных прокси.

Скринкаст о том, как это сделать, можно найти здесь: http://www.dnrtv.com/default.aspx?showNum=122

Вы можете попробовать императив вместо декларативной модели, см.: http://msdn.microsoft.com/en-us/library/ms730088.aspx

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