У меня есть веб-служба WCF, в настоящее время обслуживаемая через конечную точку WSHttpBinding с типом безопасности транспорта и клиентского доступа Windows. Служба размещается поверх IIS 5.1 с SSL, настроенным с использованием сертификата из центра сертификации домена. Сам IIS работает с именем test@domain.com на компьютере домена. Анонимный доступ отключен, и встроенная проверка подлинности Windows является единственным способом проверки подлинности.
У службы есть метод, который возвращает текущее имя личности Windows и уровень олицетворения. В методе Impersonation установлено значение Required в его OperationBehaviourAttribute.
[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, подписанная сертификатом домена, который был перемещен в хранилище сертификатов доверенных издателей.
На главном компьютере test@domain.com и current@domain.com в домене настроена функция Allow Delegation, и ни один из пользователей не помечен как конфиденциальный. 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, поэтому функциональный уровень можно повысить в целях тестирования, настраивая rest. из инфраструктуры довольно много работы.
Это проблема, которую я не мог решить в течение некоторого времени. Кажется, что в Интернете полно статей «Вот как ты это делаешь», но мне не повезло с ними. Есть идеи что не так?