首页 > 解决方案 > 使用 WSDualHttpBinding 在 WCF 服务之间共享 Windows 标识

问题描述

我在 IIS 7 中分别托管了两个 WCF 服务。第一个服务可从外部调用,并使用WebHttpBindingWindows 身份验证。第二个服务仅由第一个服务调用,使用WsDualHttpBinding.

当第一个服务被调用时,我可以从ServiceSecurityContext.Current.WindowsIdentity.Name. 在第二项服务中,这不起作用,ServiceSecurityContext.Current.WindowsIdentity.Name只是IIS APPPOOL\DefaultAppPool.

我将其配置WsDualHttpBinding为使用 Windows 身份验证,但这没有帮助。这是服务器端配置:

<wsDualHttpBinding>
  <binding name="internalHttpBinding">
    <security mode="Message">
      <message clientCredentialType="Windows"/>
    </security>
  </binding>
</wsDualHttpBinding>

这是第一个服务中与第二个服务建立通信的代码:

private WSDualHttpBinding binding = new WSDualHttpBinding();
private ChannelFactory<IMyService> factory;
public IMyService Contract { get; set; }
public MyServiceCallback Callback { get; set; }

public MyService(Uri uri)
{
    EndpointAddress address = new EndpointAddress(uri);
    Callback = new MyServiceCallback();
    var instanceContext = new InstanceContext(Callback);

    binding.Security.Mode = WSDualHttpSecurityMode.Message;
    binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows;

    factory = new DuplexChannelFactory<IMyService>(instanceContext, binding, address);
    factory.Credentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;
    factory.Credentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials;
    Contract = factory.CreateChannel();

    // Call operations on Contract
}

如何配置第一个服务以将用户的身份传递给第二个服务?

标签: c#wcfwindows-authenticationwsdualhttpbinding

解决方案


这似乎是直通身份验证的问题。首先,您需要处于 Active Directory 环境中。必须使用 Kerberos 进行身份验证,NTLM 将不起作用。您可以使用 klist 进行检查: https ://docs.microsoft.com/en-us/windows-server/administration/windows-commands/klist

另请参阅 https://blogs.msdn.microsoft.com/besidethepoint/2010/05/08/double-hop-authentication-why-ntlm-fails-and-kerberos-works/ 以获得解释。

可能这篇SO文章可以提供帮助:

将 Windows 凭据传递给远程 https WCF 服务

这: https ://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/delegation-and-impersonation-with-wcf


推荐阅读