Учетные данные Windows WCF - PullRequest
3 голосов
/ 10 августа 2009

мой клиент на сервере A вызывает службу на B, которая вызывает службу на C.
Чтобы звонок работал с B-> C, мне нужно сделать следующее:

channel.Credentials.Windows.ClientCredential = 
   new System.Net.NetworkCredential("WndowsUserName", "WindowsPassWord");  
IService1 service = channel.CreateChannel();  

и т.д ...

имя пользователя и пароль - это учетные данные Windows, используемые в A-> B Конечно, я не хочу жестко кодировать это, так как я могу сделать это без жесткого кодирования?

Я пытался, но не повезло:

WindowsIdentity callerWindowsIdentity = 
    ServiceSecurityContext.Current.WindowsIdentity;  
using (callerWindowsIdentity.Impersonate())  

Ответы [ 3 ]

2 голосов
/ 10 августа 2009

Использование

System.Net.CredentialCache.DefaultNetworkCredentials

недвижимость. Он представляет учетные данные аутентификации для текущего контекста безопасности, в котором работает приложение. Подробности можно найти здесь .

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

Кажется, это проблема аутентификации "двойной прыжок". Короче говоря, NTLM не допускает более одного «прыжка» со своими учетными данными (токеном). Таким образом, пользователь аутентифицируется на сервере 1 с помощью своего токена, и, в свою очередь, сервер 1 пытается отправить токен серверу 2. Это не будет работать, если только делегирование Kerberos не разрешено между сервером 1 и 2.

Подробнее здесь: http://weblogs.asp.net/owscott/archive/2008/08/22/iis-windows-authentication-and-the-double-hop-issue.aspx И здесь: http://blogs.msdn.com/nunos/archive/2004/03/12/88468.aspx

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

Возможно, класс

System.Net.CredentialCache

может быть полезным ... Он имеет свойства DefaultCredentials и DefaultNetworkCredentials, которые вы можете использовать. Конечно, вы должны будете убедиться, что ваше приложение работает под теми учетными данными, которые вы хотите (то есть учетными данными текущего пользователя). Это можно сделать, позвонив по номеру

AppDomain.CurrentDomain.SetPrincipalPolicy (PrincipalPolicy.WindowsPrincipal);

В начале вашей программы.

Затем, когда вы инициализируете службу WCF, вы можете использовать DefaultNetworkCredentials, предоставленный CredentialCache.

channel.Credentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials;
IService1 service = channel.CreateChannel();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...