Como especificar as credenciais do Windows no arquivo de configuração do cliente WCF

StackOverflow https://stackoverflow.com/questions/950928

  •  10-09-2019
  •  | 
  •  

Pergunta

Eu tenho um serviço WCF usando BasicHttpBinding com a autenticação do Windows. A maioria dos clientes são contas de domínio e se conectar ao serviço usando suas credenciais padrão.

Agora eu quero conectar ao serviço de um cliente ASP.NET que está sendo executado sob uma conta local. Eu quero ligar para o serviço WCF usando credenciais do Windows (domínio \ usuário e senha) que estão disponíveis para o aplicativo ASP.NET.

Eu sei que posso fazer isso no código usando ClientBase .ClientCredentials.

Existe uma maneira de especificar as credenciais (domínio \ usuário e senha) no arquivo web.config do cliente, então eu não tenho que mudar o código?

Editar

Se ele não pode ser feito no arquivo de configuração, há uma maneira de usar System.Net.ICredentials ou System.Net.NetworkCredential como uma credencial para um serviço WCF?

O .NET Framework fornece estes como uma forma homogênea para fornecer credenciais de rede, mas com WCF este parece ter sido jogado fora em favor de um novo sistema incompatível com base na classe System.ServiceModel.Description.ClientCredentials independentes.

EDIT 2

Aceitar a resposta de Marc à pergunta original - parece que não há nenhuma maneira de fazer isso no arquivo de configuração do cliente: (

Eu vejo isso como uma deficiência em WCF - Não aceito que a Microsoft deveria ser deliberadamente nos desencorajar de colocar credenciais no arquivo de configuração - afinal eles têm de ser armazenados em algum lugar, eo Framework inclui facilidades para criptografar o arquivo de configuração. Eu acho que eu poderia criar um BehaviorExtensionElement personalizado para isso, mas ele deve estar disponível fora da caixa.

É também um pouco inconsistente: o elemento de configuração system.net/mailSettings/smtp/network permite credenciais a ser especificado, então porque não WCF

?

Quanto à segunda pergunta sobre o uso System.Net.NetworkCredential, parece de neste blog que é possível, pelo menos quando se usa a autenticação do Windows, com o seguinte código:

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

Solução

Você não pode especificar suas credenciais no arquivo de configuração, infelizmente - você tem que fazer isso no código (provavelmente porque senão você pode acabar com credenciais em seu arquivo de configuração, em texto simples - não é uma coisa boa .. ..).

Outras dicas

Svc.ClientCredentials.UserName.UserName = AppSettings["WCFSvcUsername"];
Svc.ClientCredentials.UserName.Password = AppSettings["WCFSvcPassword"];

está incorreto. Ele é usado com segurança de mensagens e clientCredentialType = "username" . Você deve usar

Svc.ClientCredentials.Windows.ClientCredential = new NetworkCredential(...);

Parece que não há nenhuma maneira de ID de conjunto e senha na configuração de ligação padrão (Eu ainda estou procurando), eu fiz isso adicionando o código abaixo, mas ainda deseja a Microsoft iria adicioná-lo às ligações padrão

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

Sebastian Castaldi

Eu entendo que não existe um mecanismo para especificar as credenciais dentro do marcas, mas por que não fazer isso:

 Svc.ClientCredentials.UserName.UserName = AppSettings["WCFSvcUsername"];
 Svc.ClientCredentials.UserName.Password = AppSettings["WCFSvcPassword"];
Svc.ClientCredentials.Windows.ClientCredential = 
    System.Net.CredentialCache.DefaultNetworkCredentials;

Você já tentou isso?

<system.web>
      <identity impersonate="true" userName="username" password="password"/>
</system.web>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top