Передача удостоверения Windows в WCF из ASP.NET - PullRequest
2 голосов
/ 05 января 2012

У меня есть служба WCF, размещенная в IIS с включенной встроенной проверкой подлинности Windows и отключенной анонимной проверкой подлинности. Когда я пытаюсь вызвать эту службу из ASP.NET, я получаю следующее исключение MessageSecurityException:

"HTTP-запрос не авторизован с помощью схемы аутентификации клиента« Согласование ». Заголовок аутентификации, полученный от сервера, был« Согласование, NTLM ».]»

Есть идеи?

Это моя конфигурация сервиса:

<system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="CalculatorServiceBasicHttpBinding">
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Windows" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
<services>
  <service name="Service.CalculatorService" 
           behaviorConfiguration="CalculatorServiceBehavior">
    <endpoint name="BasicHttpEndpoint"
              address="" 
              binding="basicHttpBinding" 
              bindingConfiguration="CalculatorServiceBasicHttpBinding"
              contract="Framework.ICalculatorService">
    </endpoint>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="CalculatorServiceBehavior">
      <serviceMetadata httpGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>

Вот как я звоню в службу:

var basicHttpBinding = new BasicHttpBinding();
basicHttpBinding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
basicHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
var factory = new ChannelFactory<Framework.ICalculatorService>(basicHttpBinding, new EndpointAddress("http://localhost/CalculatorService/CalculatorService.svc")); 
factory.Credentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials;
var proxy = factory.CreateChannel();
var emailAddress = proxy.GetMyEmailAddress();
((ICommunicationObject)proxy).Close();
factory.Close();

1 Ответ

1 голос
/ 06 января 2012

Ваша конфигурация WCF работает для меня, поэтому, скорее всего, вы не настроили IIS правильно для вашей службы WCF (и, возможно, вашего клиента ASP.NET). Убедитесь, что сайт IIS, на котором размещена ваша служба, настроен, как описано в этой статье TechNet для IIS 7. В стандартной комплектации IIS 7 не включен для проверки подлинности Windows. Если вы используете IIS 6, то вам нужно выполнить поиск, чтобы увидеть, как он настроен для проверки подлинности Windows.

Как только IIS настроен правильно для вашей службы, вам нужно настроить сайт ASP.NET, который вызывает вашу службу. По умолчанию ASP.NET AppPool для вашего веб-сайта будет использовать учетную запись локального компьютера (ApplicationPoolIdentity или, возможно, NetworkService). Вам нужно будет изменить эту учетную запись на соответствующую учетную запись домена. Также необходимо убедиться, что ваша служба позволяет этой учетной записи домена получать к ней доступ путем добавления правила авторизации в IIS Manager или обновления файла service web.config, как описано в статье TechNet.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...