У меня есть веб-служба WCF, которая в настоящее время обслуживается через конечную точку WSHttpBinding с безопасностью транспорта и типом учетных данных клиента Windows. Служба размещается поверх IIS 5.1 с SSL, настроенным с использованием сертификата центра сертификации домена. Сам IIS работает с идентификатором [email protected] на компьютере домена. Анонимный доступ отключен, и встроенная проверка подлинности Windows является единственным способом проверки подлинности.
У службы есть метод, который возвращает текущее имя удостоверения Windows и уровень олицетворения. В атрибуте OperationBehaviourAttribute для метода олицетворение установлено значение Required.
[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public IEnumerable<string> GetInformation()
{
WindowsIdentity identity = WindowsIdentity.GetCurrent();
return new List<string>()
{
identity.Name,
identity.ImpersonationLevel.ToString()
};
}
Я создаю канал WCF вручную в клиенте и разрешаю делегирование службы.
WSHttpBinding binding = new WSHttpBinding();
binding.Security.Mode = SecurityMode.Transport;
binding.Security.Transport.ClientCredentialType =
HttpClientCredentialType.Windows;
EndpointAddress endpoint =
new EndpointAddress("https://host/DelegateService/Service.svc");
ChannelFactory<ServiceInterface.IService> cf =
new ChannelFactory<ServiceInterface.IService>(binding, endpoint);
cf.Credentials.Windows.AllowedImpersonationLevel =
TokenImpersonationLevel.Delegation;
ServiceInterface.IService service = cf.CreateChannel();
Клиент представляет собой полностью доверенный XBAP, подписанный сертификатом домена, который был перемещен в хранилище сертификатов доверенных издателей.
На хост-компьютере [email protected] и [email protected] в домене настроено разрешение делегирования, и ни один из пользователей не помечен как конфиденциальный. SeImpersonatePrivilege также не должен быть проблемой, поскольку олицетворение работает.
Когда клиент вызывает метод службы, метод возвращает «домен\текущий» и «олицетворение». Что мне нужно, так это «домен\текущий» и «Делегирование». Согласно второй таблице на http://msdn.microsoft.com/en-us/library/ms730088.aspx это будет означать, что клиент или служба не могут делегировать.
Домен имеет функциональный уровень Windows 2000 Mixed. Я где-то читал, что это подразумевает аутентификацию NTLM, но я полагаю, что это относится к трафику между контроллерами домена. Когда он не работает поверх https, Wireshark показывает supportedMech: 1.2.840.48018.1.2.2 (MS KRB5 - Microsoft Kerberos 5)
в ответе http, поэтому кажется, что Kerberos включен.
Технически мы могли бы поднять функциональный уровень до Windows 2003, так как два контроллера домена, которые у нас есть, оба являются серверами W2K3, но ИТ-отдел в настоящее время не может выделить ресурсы для операций резервного копирования и того, что они хотят сделать, прежде чем идти и повышать функционал. уровень.
У нас есть виртуальный тестовый домен, который можно обновить до функционального уровня Windows Server 2003, но в этом домене отсутствует центр сертификации или клиентские компьютеры с установленным IIS, поэтому функциональный уровень может быть повышен для целей тестирования, настройки остальной инфраструктуры. довольно много работы.
Это проблема, которую я не мог решить в течение некоторого времени. Интернет, кажется, полон статей типа «Вот как вы это делаете», но мне не повезло с ними. Есть идеи, что не так?