Можно ли настроить службу WCF, размещенную на IIS, для ОБА Windows Auth и Anonymous? - PullRequest
0 голосов
/ 11 июня 2009

У меня есть небольшой веб-сервис WCF, работающий со встроенным сервисным хостом WCF и хостингом с помощью встроенного веб-сервера разработки Visual Studio 2008.

В этих средах хостинга я использовал тестовый клиент WCF для вызова методов сервиса.

Теперь у меня проблемы с моим следующим этапом тестирования:

Он размещен в IIS 5.1 на моем компьютере с WinXP, и я думаю, что, возможно, проблема в том, что я больше не могу использовать тестовый клиент WCF. Вот что происходит:

Случай 1: «Анонимный доступ» ПРОВЕРЕН (ВКЛЮЧЕН)

Пользовательский интерфейс WCF Test Client запускается правильно, открывая WebMethods и кнопку INVOKE. Тем не менее, когда я нажимаю INVOKE, он не может соединиться с внутренним хранилищем данных (сторонним продуктом), для которого требуется проверка подлинности Windows. Я мог бы опубликовать ошибку, которую я получил от product.DLL, но я не думаю, что это актуально.

Случай 2: «Анонимный доступ» НЕ ПРОВЕРЕН (ОТКЛЮЧЕН)

Пользовательский интерфейс WCF Test Client не может даже правильно инициализироваться. Мои исследования показывают, что MEX (WS-Metadata Exchange) требует «анонимного доступа», а (очевидно) WCF Test Client требует MEX. Вот ключевые фрагменты возвращаемой ошибки:

Error: Cannot obtain Metadata from http://localhost/wcfiishost
The remote server returned an error: (401) Unauthorized.HTTP GET Error
URI: http://localhost/wcfiishost    
There was an error downloading 'http://localhost/wcfiishost'.    
The request failed with the error message:
Security settings for this service require 'Anonymous' Authentication but it is not enabled for the IIS application that hosts this service

Существует множество объяснений вариантов привязки, безопасности сообщений и т. Д., И, честно говоря, не понимаю. Вот мое мнение о том, где я нахожусь, но я хотел бы услышать ваше мнение:

(a) Поскольку я знаю, что мой веб-сервис WCF ДОЛЖЕН быть настроен на использование аутентификации Windows, я заключаю, что не могу продолжать использовать тестовый клиент WCF при размещении моей службы в IIS. То, что это эффективно пережило это, полезно для меня. Мне просто нужно время, чтобы написать веб-клиент, потому что WCFTestClient не будет работать без Anonymous.

(или)

(b) Можно использовать тестовый клиент WCF, если он и размещенная служба настроены правильно (я просто не знаю, какие специальные методы настройки для этого используются).

Что правильно? Время прекратить использовать WCFTestClient или есть способ сделать это обоими способами? Заранее спасибо за совет.

РЕДАКТИРОВАТЬ: 11 июня 09

Есть ли что-нибудь еще, что я могу предоставить, чтобы помочь кому-то еще помочь мне в этом вопросе?

Ответы [ 3 ]

0 голосов
/ 27 июня 2009

Марк, ваша установка даже близко не подходит к Джонсу.

Джон использует WSHttpBinding, который использует учетные данные Windows для транспорта в режиме сообщений. Аутентификация Windows не используется с BasicHttpBinding. Кроме того, Джон отключил AnonymousAuthentication, из-за чего происходит сбой обмена метаданными (mex).

Вызов даже не будет достигнут внутри сервисной функции, потому что мы получаем ошибку 401 (не авторизовано) при попытке вызова.

Просто знайте, Джон, у меня та же проблема, и я пытаюсь как-то настроить отдельные привязки для конечной точки. Надеюсь, это сработает.

0 голосов
/ 09 декабря 2009

Когда я установил заголовок / тему этого вопроса и зашел в тупик, я открыл ту же проблему на форуме MSDN с другим акцентом на заголовок (содержание вопроса по сути одинаковое).

Для меня реальная проблема заключалась в том, как использовать WCFTestClient в IIS без установки анонимной аутентификации (поскольку моей службе требовалась только встроенная аутентификация Windows).

Mex, очевидно, требует Anonymous, и по умолчанию WCFTestClient, кажется, нуждается в Mex. Ключ, кажется, подходит для моего тщательного изучения файла web.config.

Во всяком случае, я получил его работать с этим web.config ниже ( ссылка MSDN здесь :

<?xml version="1.0"?>
<configuration>

            <endpoint address="" 
                        binding="wsHttpBinding"
                        bindingConfiguration="wsBindingConfig"
                        contract="sdkTrimFileServiceWCF.IFileService">

                                 <identity>
                                    <dns value="localhost" />
                                 </identity>
            </endpoint>

            <endpoint address="basic" 
                        binding="basicHttpBinding"
                        bindingConfiguration="bindingConfig" 
                        contract="sdkTrimFileServiceWCF.IFileService" />
        </service>
    </services>

    <bindings>
        <basicHttpBinding>
            <binding name="bindingConfig">
                <security mode="TransportCredentialOnly">
                    <transport clientCredentialType="Windows"/>
                </security>
            </binding>
        </basicHttpBinding>

        <wsHttpBinding>
            <binding name="wsBindingConfig">
                <security mode="Transport">
                    <transport clientCredentialType="Windows"/>
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>

        </serviceBehaviors>
    </behaviors>

0 голосов
/ 11 июня 2009

Я только что попытался иметь ту же настройку - но в моем случае все, кажется, работает просто отлично.

  • Веб-сайт ASP.NET
  • Служба WCF, использующая basicHttpBinding без каких-либо специальных настроек вообще
  • Приложение IIS с анонимным = включена и аутентификация Windows = включена (оба включены)

Я могу легко подключиться к нему с помощью WcfTestClient и получить метаданные, и затем я могу вызвать его, без проблем.

Внутри моей сервисной функции я проверяю, является ли текущий пользователь известным пользователем или нет, он правильно идентифицирован как аутентифицированный пользователь Windows:

    ServiceSecurityContext ssc = ServiceSecurityContext.Current;

    if (ssc.IsAnonymous)
    {
        return "anonymous user";
    }
    else
    {
        if(ssc.WindowsIdentity != null)
        {
            return ssc.WindowsIdentity.Name;
        }

        if (ssc.PrimaryIdentity != null)
        {
            return ssc.PrimaryIdentity.Name;
        }
    }

    return "(no known user)";

Я действительно не знаю, что еще нужно проверить (за исключением того, что я на Vista с IIS7). Есть ли шанс, что вы могли бы включить этот код для проверки пользователя в вашем сервисном коде? Просто чтобы увидеть ....

Марк

...