У меня есть автономная служба WCF, доступ к которой можно получить с помощью WebHttpBinding. Эта служба должна получить токен kerberos от интернет-обозревателя на клиенте, а затем он должен выдать себя за этот токен для доступа к файловому серверу через общий сетевой ресурс на другом сервере.

Как эта цепочка:

IE (Client) -> WCF-Service (BI-Server) -> impersonate -> access network share on file server

Но IE представляет диалоговое окно входа в систему, если я изменю ClientCredentialType или добавлю ServiceAuthenticationBehavior с настройками Kerberos (401 Unauthorized).

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

На том же сервере есть NetTcpBinding с Kerberos, который отлично работает.

Что я делаю не так?

Делегирование для Kerberos (все службы) активировано на сервере BI.

  • ADS-Functional Level - 2012 г.
  • Файловый сервер - это Windows Server 2003
  • WCF / IIS-Host - это Windows Server 2012 R2
  • Клиент - Windows 8, IE 10

Теперь код для канала:

var listenUrl =  "http://0.0.0.0:8735";

var bind = new WebHttpBinding(WebHttpSecurityMode.TransportCredentialOnly)
{
         Security = {Transport = {ClientCredentialType = HttpClientCredentialType.InheritedFromHost}},
         TransferMode = TransferMode.StreamedResponse
};

var host = new WebServiceHost(typeof(C_SIS), new Uri(listenUrl));
host.AddServiceEndpoint(typeof(IW_SIS), bind, "").Behaviors.Add(new WebHttpBehavior());

ServiceAuthenticationBehavior sab = null;
sab = host.Description.Behaviors.Find<ServiceAuthenticationBehavior>();
if (sab == null)
{
         sab = new ServiceAuthenticationBehavior();
         sab.AuthenticationSchemes = AuthenticationSchemes.Negotiate | AuthenticationSchemes.Ntlm;
         host.Description.Behaviors.Add(sab);
}
else
{
         sab.AuthenticationSchemes = AuthenticationSchemes.Negotiate | AuthenticationSchemes.Ntlm;
}

host.UnknownMessageReceived += new EventHandler<UnknownMessageReceivedEventArgs>(UnbekannterRecv);
host.Open();
0
Floyd 15 Авг 2014 в 10:12
Убедитесь, что в IE установлены флажки «Включить встроенную проверку подлинности Windows» -> «Настройки» -> «Дополнительно» -> «Безопасность».
 – 
Robert
15 Авг 2014 в 11:25
Включен и работает в других сценариях использования (например, в интрасети)
 – 
Floyd
15 Авг 2014 в 11:30

1 ответ

Лучший ответ

Сначала убедитесь, что ваша служба работает с пользователем домена. Затем вы должны установить SPN (имя участника-службы) для этого пользователя.

setspn -s http\wcfHostMachineName:PORT DOAMIN\User
setspn -s http\wcfHostMachineName.FULLDomain.Quantifier:PORT DOAMIN\User

Очистите все токены Kerberos на вашем клиенте с помощью

klist -purge

Попробуй. Если работает -> нормально. Но если вы не открываете свою ADS-User-Configuration и удаляете все http-SPN без порта, формируйте wcfHost, а не пользователя! Для узла wcfHost требуются отдельные имена участников-служб.

0
Floyd 18 Авг 2014 в 16:37