25

我有一个使用带有 Windows 身份验证的 BasicHttpBinding 的 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 的第二个问题,从这个博客看来,至少在使用 Windows 身份验证时,可以使用以下代码:

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

6 回答 6

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

是不正确的。它与消息安全性clientCredentialType="UserName"一起使用。你应该使用

Svc.ClientCredentials.Windows.ClientCredential = new NetworkCredential(...);
于 2010-09-17T09:11:51.617 回答
10

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

于 2009-06-04T14:30:56.190 回答
5

似乎没有办法在默认绑定配置中设置 id 和密码(我还在寻找),我在下面添加了代码,但仍然希望微软将其添加到默认绑定中

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

塞巴斯蒂安·卡斯塔尔迪

于 2011-05-16T14:44:45.797 回答
4

我知道没有一种机制可以在 <binding> 标记中指定凭据,但为什么不这样做:

 Svc.ClientCredentials.UserName.UserName = AppSettings["WCFSvcUsername"];
 Svc.ClientCredentials.UserName.Password = AppSettings["WCFSvcPassword"];
于 2009-06-04T14:44:44.027 回答
2
Svc.ClientCredentials.Windows.ClientCredential = 
    System.Net.CredentialCache.DefaultNetworkCredentials;
于 2011-04-06T19:24:38.803 回答
0

你试过这个吗?

<system.web>
      <identity impersonate="true" userName="username" password="password"/>
</system.web>
于 2009-06-04T14:41:53.703 回答