如何在WCF客户端配置文件中指定Windows凭据

时间:2009-06-04 14:23:40

标签: wcf credentials

我有一个使用BasicHttpBinding和Windows身份验证的WCF服务。 大多数客户端都是域帐户,并使用其默认凭据连接到服务。

现在我想从一个在本地帐户下运行的ASP.NET客户端连接到该服务。我想使用ASP.NET应用程序可用的Windows凭据(域\用户和密码)连接到WCF服务。

我知道我可以使用ClientBase< T> .ClientCredentials在代码中执行此操作。

有没有办法在客户端的web.config文件中指定凭据(域\用户和密码),所以我不必更改代码?

修改

如果在配置文件中无法完成,是否有办法使用System.Net.ICredentials或System.Net.NetworkCredential作为WCF服务的凭据?

.NET Framework提供这些作为提供网络凭据的同类方式,但是对于WCF,这似乎已被抛弃,而不是基于不相关的System.ServiceModel.Description.ClientCredentials类的新的不兼容系统。

编辑2

接受Marc对原始问题的回答 - 似乎在客户端配置文件中无法做到这一点:(

我认为这是WCF的一个缺陷 - 我不接受微软应该故意阻止我们在配置文件中放置凭据 - 毕竟它们必须存储在某个地方,并且框架包括用于加密的设施配置文件。我想我可以为此创建一个自定义的BehaviorExtensionElement,但它应该是开箱即用的。

它也有点不一致:system.net/mailSettings/smtp/network配置元素允许指定凭据,为什么不是WCF?

关于使用System.Net.NetworkCredential的第二个问题,从this blog可以看出,至少在使用Windows身份验证时,可以使用以下代码:

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

6 个答案:

答案 0 :(得分:18)

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

不正确。它与邮件安全性 clientCredentialType =“UserName”一起使用。你应该使用

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

答案 1 :(得分:11)

不幸的是,您无法在配置文件中指定您的凭据 - 您必须在代码中执行此操作(最可能的原因是,否则您可能会在配置文件中以明文形式获得凭据 - 这不是一件好事...... ..)。

答案 2 :(得分:5)

似乎没有办法在默认绑定配置中设置id和密码(我还在寻找),我做了它添加下面的代码,但仍希望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;

Sebastian Castaldi

答案 3 :(得分:4)

据我所知,没有一种机制可以在&lt; binding&gt;中指定凭据。标签,但为什么不这样做:

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

答案 4 :(得分:1)

Svc.ClientCredentials.Windows.ClientCredential = 
    System.Net.CredentialCache.DefaultNetworkCredentials;

答案 5 :(得分:0)

你试过这个吗?

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