У меня есть веб-сайт, размещенный на сервере ServerA, который работает с использованием пула приложений, используя специальный учетную запись пользователя с привилегиями домена для доступа к нашей базе данных. В конфигурационном файле сайта я указываю:
<identity impersonate="true" />
Затем у меня есть служба, которая также находится на ServerA и программно размещена в консольном приложении (то есть без файла конфигурации), как показано ниже.
Uri uri = new Uri("net.tcp://ServerA:9900/Service/");
ServiceHost host = new ServiceHost(typeof(Service1), uri);
NetTcpBinding binding = new NetTcpBinding();
binding.Security.Mode = SecurityMode.Message;
binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows;
ServiceEndpoint serviceEndpoint = host.AddServiceEndpoint(typeof(IService1), binding, uri);
EndpointAddress myEndpointAddress = new EndpointAddress(uri, EndpointIdentity.CreateSpnIdentity("MyspnName"));
serviceEndpoint.Address = myEndpointAddress;
host.Open();
Когда я открываю браузер на своем локальном компьютере и захожу на веб-сайт, веб-сайт пытается подключиться к серверу WCF и возвращает сообщение об ошибке «Не удалось выполнить запрос маркера безопасности из-за сбоя аутентификации».
Сайт использует следующий код для подключения к услуге:
Uri uri = new Uri("net.tcp://ServerA:9900/Service/");
NetTcpBinding binding = new NetTcpBinding();
binding.Security.Mode = SecurityMode.Message;
binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows;
EndpointIdentity epid = EndpointIdentity.CreateSpnIdentity("MyspnName");
EndpointAddress endPoint = new EndpointAddress(uri, epid);
//EndpointAddress endPoint = new EndpointAddress(uri);
ChannelFactory<IService1> channel = new ChannelFactory<IService1>(binding, endPoint);
channel.Credentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Delegation;
IService1 service = channel.CreateChannel();
service.PrintMessage("Print this message!");
Для PrintMessage, метода, который я вызываю, я пробовал [OperationBehavior(Impersonation = ImpersonationOption.Required)]
и .... Допускается ... но ошибка та же.
Когда я запускаю веб-сайт локально, используя LocalHost, ошибки не возникает, и она отлично работает. А также, когда я меняю тождество impersonate = "false" в моем файле web.config, он запускается, но мои учетные данные Windows не передаются в службу WCF, и в этом весь смысл.
Есть идеи, что мне не хватает? Просьба никаких общих ссылок, я, наверное, уже читал!
большое спасибо