我在服务器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())
答案 0 :(得分:2)
答案 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();