Запрос метаданных требует проверки подлинности в WCF, хотя страница описания службы не - PullRequest
2 голосов
/ 01 апреля 2011

Я настроил службу 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 ]

0 голосов
/ 10 апреля 2011

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

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

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

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

0 голосов
/ 01 апреля 2011
...