2009-06-04 57 views
25

我有一个使用BasicHttpBinding和Windows身份验证的WCF服务。 大多数客户端都是域帐户,并使用其默认凭证连接到该服务。如何在WCF客户端配置文件中指定Windows凭据

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

我知道我可以在代码中使用ClientBase < T> .ClientCredentials来做到这一点。

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

编辑

如果它不能在配置文件中进行,有没有使用System.Net.ICredentials或System.Net.NetworkCredential作为一个WCF服务凭证的方式吗?

.NET框架提供了这些提供网络凭证的同源方式,但对于WCF,似乎已经抛弃了基于不相关的System.ServiceModel.Description.ClientCredentials类的新的不兼容系统。

EDIT 2

接受马克的回答原来的问题 - 这似乎是没有办法的客户端配置文件:(

我会认为这是在WCF缺乏在这样做 - 我不认为微软应该故意阻止我们把证书放在配置文件中 - 毕竟他们必须存储在某个地方,并且Framework包含了用于加密配置文件的工具。我想我可以为此创建一个自定义的BehaviorExtensionElement ,但它应该是开箱即用的。

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

关于如何使用System.Net.NetworkCredential第二个问题,从this blog,这是可能的,使用至少在Windows身份验证,用下面的代码看起来:

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

回答

11

你不能指定不幸的是,你必须在代码中做到这一点(很可能是因为否则,你可能会在配置文件中以纯文本形式结束凭据 - 这不是一件好事情......)。

+3

“......在你的配置文件,以纯文本”是不是一般的好东西,但在加密的配置文件就可以了。 – Joe 2009-06-04 17:02:28

+0

@marc_s它是否仍然无法通过配置文件进行设置? – 2013-02-28 11:31:08

+1

@Johnny_D:不会,据我所知。 – 2013-02-28 12:39:23

0

你试过吗?

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

不,这没有真正的帮助 - ASP.NET服务器不受信任委派。 – Joe 2009-06-04 17:01:28

4

据我所知,没有指定<结合>标签内的凭据的机制,但为什么不能做到这一点:

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

不正确。它与消息安全性一起使用clientCredentialType =“UserName”。您应该使用

Svc.ClientCredentials.Windows.ClientCredential = new NetworkCredential(...); 
1
Svc.ClientCredentials.Windows.ClientCredential = 
    System.Net.CredentialCache.DefaultNetworkCredentials; 
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; 

塞巴斯蒂安Castaldi