【问题标题】:WCF windows credentialsWCF 窗口凭据
【发布时间】:2009-08-10 08:58:31
【问题描述】:

我在服务器 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())  

【问题讨论】:

    标签: c# asp.net wcf


    【解决方案1】:

    使用

    System.Net.CredentialCache.DefaultNetworkCredentials
    

    属性。它表示应用程序正在运行的当前安全上下文的身份验证凭据。详情可见here

    【讨论】:

    • DefaultNetworkCredentials 当我在客户端应用程序和我的服务内部运行它时具有所有空属性!?!那个链接是中文的:)
    【解决方案2】:

    这似乎是一个“双跳”身份验证问题。 简而言之,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

    【讨论】:

    • 在控制台应用中托管时是否同样适用?我猜是的,这就是我正在做的事情!因此,如果使用 Windows 身份验证是围绕我正在做的工作,即使用不同的用户帐户信息通过第一跳?
    • 是的,它适用。 NTLM 令牌只能“做”一跳。如果要允许更多跃点,则必须使用 Kerberos 委托来“允许”一台服务器将其拥有的令牌传输到另一台服务器。
    【解决方案3】:

    也许是类

    System.Net.CredentialCache
    

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

    AppDomain.CurrentDomain.SetPrincipalPolicy (PrincipalPolicy.WindowsPrincipal);
    

    在程序开始时。

    那么,在初始化WCF服务的时候,就可以使用CredentialCache提供的DefaultNetworkCredentials了。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-23
      • 2020-06-16
      相关资源
      最近更新 更多