WCF Windows凭据

时间:2009-08-10 08:58:31

标签: c# asp.net wcf

我在服务器A上的客户端调用B上的服务,该服务调用C上的服务 为了使呼叫从B-> C起作用,我必须这样做:

channel.Credentials.Windows.ClientCredential = 
   new System.Net.NetworkCredential("WndowsUserName", "WindowsPassWord");  
IService1 service = channel.CreateChannel();  

等...

用户名和密码是从A-> B使用的Windows凭证 当然我不想硬编码,所以如何在没有硬编码的情况下做到这一点?

我试过了,没有运气:

WindowsIdentity callerWindowsIdentity = 
    ServiceSecurityContext.Current.WindowsIdentity;  
using (callerWindowsIdentity.Impersonate())  

3 个答案:

答案 0 :(得分:2)

使用

System.Net.CredentialCache.DefaultNetworkCredentials

属性。它表示运行应用程序的当前安全上下文的身份验证凭据。可以找到详细信息here

答案 1 :(得分:1)

这似乎是一个“双跳”身份验证问题。 简而言之,NTLM不会使用它的凭证(令牌)不止一个“跳”。因此,用户使用它的令牌在服务器1上进行身份验证,然后服务器1尝试将令牌发送到服务器2.这将不起作用,除非服务器1和2之间允许Kerberos删除。

此处有更多详情:http://weblogs.asp.net/owscott/archive/2008/08/22/iis-windows-authentication-and-the-double-hop-issue.aspx 在这里:http://blogs.msdn.com/nunos/archive/2004/03/12/88468.aspx

答案 2 :(得分:0)

也许是班级

System.Net.CredentialCache

可能有帮助... 它具有您可以使用的DefaultCredentials和DefaultNetworkCredentials属性。 当然,您必须确保您的应用程序在您想要的凭据(即当前用户的凭据)下运行。 这可以通过调用

来完成
AppDomain.CurrentDomain.SetPrincipalPolicy (PrincipalPolicy.WindowsPrincipal);

在您的计划开始时。

然后,在初始化WCF服务时,您可以使用DefaultNetworkCredentials提供的CredentialCache

channel.Credentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials;
IService1 service = channel.CreateChannel();