Установка учетных данных для приложения WCF? - PullRequest
7 голосов
/ 14 мая 2009

Я написал простое приложение, которое использует WCF для связи между клиентом и сервером. Когда я запускаю его локально, он работает нормально, однако, когда я запускаю сервер и клиент на двух разных компьютерах, я получаю следующее исключение:

Unexpected error occured, while getting the group names from the VDN server
System.ServiceModel.Security.SecurityNegotiationException: The server has rejected the client credentials.
System.Security.Authentication.InvalidCredentialException: The server has rejected the client credentials.
System.ComponentModel.Win32Exception: The logon attempt failed

Какие учетные данные не принимаются? И как их установить?

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

Извините, что не очень конкретен: Приложение использует канал прокси, и в нем нет конфигурационного файла wcf, поскольку код wcf написан вручную.

Мой код WCF основан на коде из этого урока: http://www.switchonthecode.com/tutorials/wcf-tutorial-basic-interprocess-communication

Я не знал, что это стандартная процедура генерации классов wcf из конфигурации до тех пор, пока я не закончу писать весь код. Теперь, когда я просматриваю учебник / справочную документацию, они используют сгенерированный код, и все требует изменения конфигурации.

У меня нет пропускной способности (я уже жонглирую 3 проектами), чтобы заменить мой wcf-компонент одним, использующим сгенерированный код, но я обязательно позабочусь о генерации кода в следующий раз, когда использую wcf.

Ответы [ 3 ]

11 голосов
/ 14 мая 2009

Вот решение, которое я нашел в поиске отключения безопасности / аутентификации wcf.

С MSDN :

WSHttpBinding b = new WSHttpBinding();

b.Security.Mode = SecurityMode.None;

или добавьте в конфигурацию следующее:

<wsHttpBinding>

    <binding name="myBinding">

        <security mode="None" />

    </binding>

</wsHttpBinding>
5 голосов
/ 15 мая 2009

Создайте метод, подобный этому ...

void SetImpersonation(ref IServiceClient proxy)
{
  proxy.ClientCredentials.Windows.ClientCredential.Domain = "MYDOMAIN";
  proxy.ClientCredentials.Windows.ClientCredential.UserName = "A_USER";
  proxy.ClientCredentials.Windows.ClientCredential.Password = "P4SSW0RD";
}

и вызывайте его при создании нового класса клиента.

IServiceClient proxy = new IServiceClient ();
SetImpersonation(ref proxy);

Очевидно, что это установка информации для конкретного пользователя и имеет последствия для безопасности, если ваш код декомпилирован, но он должен работать в вашем (сценарий без конфигурационного файла)

1 голос
/ 03 ноября 2010

Если вы используете конфигурацию привязки WCF со следующей защитой:

<transport clientCredentialType="Windows" />

тогда вам нужно будет явно указать учетные данные Windows для экземпляра WCF, созданного в коде, подобном приведенному ниже:

'Create an instance of the WCF service      
Dim MyService As New MyWCFServiceClient

'Build credentials object for which this WCF call will be made
MyService.ClientCredentials.Windows.ClientCredential = New System.Net.NetworkCredential("UserName", "Password", "DomainName")

'Call a method on the service
MyService.MyMethod1()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...