Я следил за многочисленными статьями msdn и инструкциями codeplex, но не могу заставить WCF работать с аутентификацией и делегированием Kerberos, и мне очень понравилась бы небольшая помощь.Аутентификация WCF и Kerberos
Настройка
У меня есть службы WCF в качестве веб-сайта IIS на удаленном компьютере
- IIS 6.0 на Windows 2003 R2 - SP 2
- был добавлен SPN для машины (http/myserver & & http/myserver: 8080)
- Учетная запись AD создана для пула приложений IIS
- Счет AD имеет параметр, позволяющий делегирование (для Kerberos), установите истинного
Я использую Brian Booth's debug site на 8080 и сайт передает все требования для делегирования Kerberos. На веб-сайте отладки IIS отключена анонимная аутентификация и включена встроенная проверка подлинности Windows.
Я отразил эти настройки на сайте, на котором размещается служба WCF.
Web Service - Web Config (Original)
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WsHttpBindingConfig">
<security>
<message negotiateServiceCredential="true" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="ServiceBehavior" name="Service">
<endpoint address=""
binding="wsHttpBinding"
bindingConfiguration="WsHttpBindingConfig"
contract="IService">
<identity>
<servicePrincipalName value="http/myserver" />
<dns value="" />
</identity>
</endpoint>
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
<serviceAuthorization
impersonateCallerForAllOperations="true" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
Web Service - Web метод
[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public string GetCurrentUserName()
{
string name = WindowsIdentity.GetCurrent().Name;
return name;
}
Client App - App Config
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IService"
... />
...
<security mode="Message">
<transport clientCredentialType="Windows"
proxyCredentialType="None"
realm="" />
<message clientCredentialType="Windows"
negotiateServiceCredential="true"
algorithmSuite="Default"
establishSecurityContext="true" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="http://myserver/Service.svc"
binding="wsHttpBinding"
bindingConfiguration="WSHttpBinding_IService"
contract="KerberosService.IService"
name="WSHttpBinding_IService">
<identity>
<servicePrincipalName value="http/myserver" />
</identity>
</endpoint>
</client>
</system.serviceModel>
Ошибка приложения
Следующая ошибка возникает, когда мое тестовое приложение, приложение WinForms, пытается вызвать веб-метод:
«Запрос HTTP является несанкционированным с клиента схемы аутентификации „Anonymous“ , Заголовок проверки подлинности , полученные от сервера был 'Negotiate, NTLM «
Журнал событий
следующее сообщение об ошибке в журнале событий:.
Исключение: системы .ServiceModel.ServiceActivationException: Служба '/Service.svc' не может быть активирована из-за исключения во время compila Тион. Сообщение об исключении : Параметры безопасности для этой службы требуют «анонимной» аутентификации, но не включен для приложения IIS , на котором размещена эта служба.
Который я не понимаю. Весь смысл этой службы заключается в том, чтобы не допускать анонимную аутентификацию, каждый пользователь/запрос должен быть аутентифицирован с использованием билетов Kerberos, а затем передавать их другим машинам.
Как настроить эту службу WCF для аутентификации и делегирования Kerberos?
Редакция 1
После прочтения this SO question я удалил конечную точку метаданных. Это не решило проблему.
Revision 2
После еще исследования я нашел несколько постов, предполагающих, чтобы изменить WsHttpBinding к BasicHttpBinding. Модификация этой части web.config была включена ниже, и конечная точка службы была обновлена, чтобы ссылаться на эту привязку.
Web Service - Web Config (пересмотренная)
<basicHttpBinding>
<binding name="basicBindingConfig">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows"
proxyCredentialType="Windows"
realm="" />
</security>
</binding>
</basicHttpBinding>
Client App - App Config (пересмотренная)
<!-- ... -->
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows"
proxyCredentialType="Windows"
realm="" />
<message clientCredentialType="UserName"
algorithmSuite="Default" />
</security>
<!-- ... -->
Ошибка (пересмотренная)
Ток ошибка выглядит так, как будто она содержит Kerberos authe заголовок ntication.
Запрос HTTP является несанкционированным со схемой аутентификации клиента 'Переговоры'. Заголовок проверки подлинности , полученные от сервера был «Обсуди SOMEHUGESCARYKEYHERE
Примечание: я опубликовал и удалил что-то похожее вчера, это сообщение включает в себя ревизии, основанные на большем количестве исследований и должны быть чище читать. – blu
Я добавил обновленную конфигурацию приложения на основе обратной связи marc_s. – blu