2009-08-31 3 views
3

У меня есть веб-сайт, размещенный на сервере ServerA, который работает с использованием пула приложений, используя специальный пользовательский атрибут с правами домена для доступа к нашей базе данных. В конфигурационном файле веб-сайта Уточняю:WCF и учетные данные о прохождении окон

<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)] и .. .Allowed .. но ошибка та же.

Когда я запускаю сайт локально с помощью LocalHost, ошибки нет, и он работает отлично. А также когда я изменяю идентификатор impersonate = "false" в моем web.config, он запускается, но мои учетные данные Windows не передаются в службу WCF, что является целым.

Любые идеи, что мне не хватает? Pls нет общих ссылок, я, наверное, уже прочитал это!

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

+0

Это действительно поможет, если вы разместите фактическую разметку файла конфигурации как часть своего вопроса. Решение может быть таким же простым, как забыть добавить ссылку и т. Д. –

ответ

1

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

ServiceSecurityContext.Current.WindowsIdentity 

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

Если значение WindowsIdentity должно быть NULL, тогда у вас действительно нет проверки подлинности Windows.

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

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

Марк

+0

Ошибка происходит, когда я пытаюсь вызвать службу, поэтому я не могу распечатать любую информацию внутри моей службы. Также вы можете видеть выше, что по умолчанию я размещаю в консольном приложении – 2009-08-31 11:27:36

+0

, для службы WCF не будет ничего (например, демонстрационной или стартовой страницы), которую вы могли бы просмотреть в своем браузере. Можете ли вы подключиться к своей службе с помощью WcfTestClient? Он находится в каталоге Visual Studio «Common7 \ IDE». –

+0

Да, они находятся в том же домене.Он отлично работает с WcfTestClient, а также, как я объяснил выше, он отлично работает, когда я запускаю сайт локально через VS. Он получает мои учетные данные для Windows на серверах ServerA, а затем на службу WCF, которая является проблемой. – 2009-08-31 13:01:13

0

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

Смежные вопросы