Аутентификация службы WCF с использованием безопасности транспорта iisexpress и базовой аутентификации, всегда возвращающей 401 - PullRequest
3 голосов
/ 07 апреля 2011

У меня есть служба WCF, настроенная для использования безопасности транспорта и базовой аутентификации.

Сервис размещен в iiexpress в vs2010.

Я могу подключиться из своего клиентского кода, но всегда получаю:

"The HTTP request is unauthorized with client authentication scheme 'Anonymous'. The authentication header received from the server was 'Basic realm=realm'."

И это внутреннее исключение::

"The remote server returned an error: (401) Unauthorized."

Аналогично Невозможно вызвать веб-службу с базовой аутентификацией с использованием WCF , хотя в коде моего клиента уже указаны настройки, указанные в ответе.

Я такжезатем Базовая аутентификация HTTP для учетных записей, отличных от Windows, в IIS / ASP.NET (часть 3 - Добавление поддержки WCF) и предыдущий блог по настройке модулей и классов IAuthorizationPolicy.

IISExpressнастроен в классическом режиме с анонимной аутентификацией и аутентификацией Windows отключен и SSL включен.

Client Config:

<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="NotificationHttpBinding">
          <security mode="Transport">
            <transport clientCredentialType="Basic" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="https://localhost/NotificationService.svc"
         binding="basicHttpBinding" bindingConfiguration="NotificationHttpBinding"
         contract="NotificationPortType" name="BasicHttpBinding_NotificationPortType" />
    </client>
  </system.serviceModel>

Service Config:

<system.serviceModel>

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />

    <services>
      <service name="Notification.NotificationService" behaviorConfiguration="NotificationServiceBehavior">
        <endpoint binding="basicHttpBinding" contract="NotificationPortType" bindingConfiguration="NotificationHttpBinding" >
        </endpoint>
       </service>
    </services>

    <behaviors>
      <serviceBehaviors>
        <behavior name="NotificationServiceBehavior">
          <serviceMetadata />
          <serviceDebug includeExceptionDetailInFaults="false"/>
          <serviceAuthorization>
            <authorizationPolicies>
              <add policyType="Notification.HttpContextIdentityPolicy, Notification" />
            </authorizationPolicies>
          </serviceAuthorization>
        </behavior>
      </serviceBehaviors>
    </behaviors>

    <bindings>
      <basicHttpBinding>
        <binding name="NotificationHttpBinding">
          <security mode="Transport">
            <transport clientCredentialType="Basic" />
          </security>

        </binding>
      </basicHttpBinding>
    </bindings>

  </system.serviceModel>


  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

  <system.web>

    <httpModules>
      <add name="CustomBasicAuthentication" type="Notification.CustomBasicAuthenticationModule, Notification"/>
    </httpModules>

    <membership defaultProvider="SampleProvider">
      <providers>
        <add name="SampleProvider"  type="Notification.HardcodedSecurityProviders, Notification" />
      </providers>
    </membership>

  </system.web>

Код клиента не имеет значения:

static void Main(string[] args)
        {
            ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => { return true; };

            NotificationPortTypeClient client = new NotificationPortTypeClient("BasicHttpBinding_NotificationPortType");

            client.ClientCredentials.UserName.UserName = "Test";
            client.ClientCredentials.UserName.Password = "PWD";


            client.sendNotification(new NotificationRequest());
        }

В качестве альтернативы Если кто-то может показать мне альтернативу того, как использовать IIS6 для размещения службы WCF, которая использует обычную проверку подлинности http при требовании SSL (https) Я буду счастлив с этим!


ОБНОВЛЕНИЕ Кажется, это был мой виновник все время: Избегайте http 401 туда-обратно

Тем не менее, я обнаружил, что мои модули работали нормально (в интегрированном режиме), но затем мне сообщили об ошибке службы, сообщающей, что базовая интеграция требуется, но не включена на хосте.

Открыл файл iisexpress applicationhost.config и, конечно же, нашел:

<section name="basicAuthentication" overrideModeDefault="Deny" />

, за которым следует

<basicAuthentication enabled="false" />

дальше вниз

У меня естьизменил их на <section name="basicAuthentication" overrideModeDefault="Allow" />

и попытался включить в моем web.config ... без игры в кости: (

1 Ответ

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

Вам нужно использовать WSHttpBinding.

Здесь представлен полный образец .

...