Передача удостоверения Windows в WCF из ASP.NET
У меня есть служба 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 ответ
Ваша конфигурация 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 или обновления файла web.config службы, как описано в статье TechNet.