WCF и учетные данные прохождения окон - PullRequest
3 голосов
/ 31 августа 2009

У меня есть веб-сайт, размещенный на сервере 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, и в этом весь смысл.

Есть идеи, что мне не хватает? Просьба никаких общих ссылок, я, наверное, уже читал!

большое спасибо

Ответы [ 2 ]

1 голос
/ 31 августа 2009

Если вы используете аутентификацию Windows, вы можете получить идентификацию вызывающего абонента в коде вашего сервиса здесь:

 ServiceSecurityContext.Current.WindowsIdentity

Этот WindowsIdentity содержит такие вещи, как свойство ".Name", свойство ".Groups" всех групп, к которым принадлежит пользователь и т. Д.

Если WindowsIdentity должен быть НЕДЕЙСТВИТЕЛЕН, то у вас действительно не происходит аутентификация Windows.

Размещаете ли вы свой сервис WCF в IIS? Какая версия - IIS7 - первая, которая поддерживает привязку net.tcp.

Что если вы самостоятельно размещаете свой сервис в консольном приложении - работает ли тогда проверка подлинности Windows? В этом случае это, скорее всего, будет проблема конфигурации IIS7.

Марк

0 голосов
/ 31 августа 2009

Я подозреваю, что это потому, что ваша учетная запись службы не является доверенным для делегирования. Поэтому он может выдавать себя за вызывающего абонента для доступа к локальным ресурсам, но не для вызова по TCP. Google "Доверенный для делегирования" для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...