Установка учетных данных для приложения WCF?

Я написал простое приложение, которое использует 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.


person Omar Kooheji    schedule 14.05.2009    source источник
comment
Я думаю, вам нужно быть более конкретным. Какую привязку вы используете?   -  person treehouse    schedule 14.05.2009


Ответы (3)


Создайте такой метод...

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);

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

person ZombieSheep    schedule 15.05.2009
comment
Я могу перенести эти значения в app.config. У меня просто нет файла конфигурации для кода wcf. Спасибо, хотя это выглядит хорошо. - person Omar Kooheji; 15.05.2009
comment
как избежать установки этого при каждом использовании моего клиента? Есть ли способ установить это для всех клиентов в моем решении? - person SomeRandomName; 17.01.2017

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

Из MSDN :

WSHttpBinding b = new WSHttpBinding();

b.Security.Mode = SecurityMode.None;

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

<wsHttpBinding>

    <binding name="myBinding">

        <security mode="None" />

    </binding>

</wsHttpBinding>
person mirezus    schedule 14.05.2009
comment
Вы должны быть осторожны при использовании этого решения, потому что исходное исключение может быть связано с конфигурацией привязки с использованием проверки подлинности Windows. В этом случае слепое удаление безопасности — плохая идея. Проверьте мой ответ внизу в случае использования проверки подлинности Windows. - person atconway; 03.11.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()
person atconway    schedule 03.11.2010