Как указать учетные данные Windows в файле конфигурации клиента WCF - PullRequest
25 голосов
/ 04 июня 2009

У меня есть служба WCF, использующая BasicHttpBinding с аутентификацией Windows. Большинство клиентов являются учетными записями домена и подключаются к службе, используя свои учетные данные по умолчанию.

Теперь я хочу подключиться к службе от клиента ASP.NET, который работает под локальной учетной записью. Я хочу подключиться к службе WCF, используя учетные данные Windows (домен \ пользователь и пароль), доступные для приложения ASP.NET.

Я знаю, что могу сделать это в коде, используя ClientBase .ClientCredentials.

Есть ли способ указать учетные данные (домен \ пользователь и пароль) в клиентском файле web.config, чтобы мне не пришлось менять код?

EDIT

Если это невозможно сделать в файле конфигурации, есть ли способ использовать System.Net.ICredentials или System.Net.NetworkCredential в качестве учетных данных для службы WCF?

.NET Framework предоставляет их как однородный способ предоставления сетевых учетных данных, но с WCF это, кажется, было выброшено в пользу новой несовместимой системы, основанной на несвязанном классе System.ServiceModel.Description.ClientCredentials.

РЕДАКТИРОВАТЬ 2

Принятие ответа Марка на исходный вопрос - кажется, нет способа сделать это в файле конфигурации клиента: (

Я бы посчитал это недостатком WCF - я не согласен с тем, что Microsoft должна сознательно отговаривать нас от помещения учетных данных в файл конфигурации - в конце концов, они должны где-то храниться, а Framework включает средства для шифрования Конфигурационный файл Я думаю, я мог бы создать собственный BehaviorExtensionElement для этого, но он должен быть доступен из коробки.

Это также немного противоречиво: элемент конфигурации system.net/mailSettings/smtp/network позволяет указывать учетные данные, так почему бы не WCF?

Что касается второго вопроса об использовании System.Net.NetworkCredential, то из этого блога кажется, что возможно, по крайней мере, при использовании проверки подлинности Windows, использовать следующий код:

factory.Credentials.Windows.ClientCredential =
   new System.Net.NetworkCredential(name, password, domain);

Ответы [ 6 ]

18 голосов
/ 17 сентября 2010
Svc.ClientCredentials.UserName.UserName = AppSettings["WCFSvcUsername"];
Svc.ClientCredentials.UserName.Password = AppSettings["WCFSvcPassword"];

неверно. Используется с защитой сообщений и clientCredentialType = "UserName" . Вы должны использовать

Svc.ClientCredentials.Windows.ClientCredential = new NetworkCredential(...);
11 голосов
/ 04 июня 2009

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

5 голосов
/ 16 мая 2011

Кажется, что нет способа установить идентификатор и пароль в конфигурации привязки по умолчанию (я все еще ищу), я сделал это, добавив код ниже, но все же хотел бы, чтобы Microsoft добавила его к привязкам по умолчанию

    <appSettings>
     <add key="user"  value="user" />
     <add key="password"  value="password" />
     <add key="domain"  value="domain" />
   </appSettings>


   // client side code
   string userName =  ConfigurationManager.AppSettings.Get("user");
   string pswd = ConfigurationManager.AppSettings.Get("password");
   string domain = ConfigurationManager.AppSettings.Get("domain");

   client.ClientCredentials.Windows.ClientCredential.Domain = domain; 
   client.ClientCredentials.Windows.ClientCredential.UserName = userName;
   client.ClientCredentials.Windows.ClientCredential.Password = pswd;

Себастьян Кастальди

4 голосов
/ 04 июня 2009

Я понимаю, что нет механизма для указания учетных данных в тегах , но почему бы не сделать это:

 Svc.ClientCredentials.UserName.UserName = AppSettings["WCFSvcUsername"];
 Svc.ClientCredentials.UserName.Password = AppSettings["WCFSvcPassword"];
1 голос
/ 06 апреля 2011
Svc.ClientCredentials.Windows.ClientCredential = 
    System.Net.CredentialCache.DefaultNetworkCredentials;
0 голосов
/ 04 июня 2009

Вы пробовали это?

<system.web>
      <identity impersonate="true" userName="username" password="password"/>
</system.web>
...