WCF Web服务中的委派

时间:2009-04-26 11:26:39

标签: c# wcf ssl active-directory xbap

我有一个WCF Web服务,目前通过WSHttpBinding端点提供传输安全性和Windows客户端凭据类型。该服务托管在IIS 5.1之上,并使用来自域证书颁发机构的证书配置SSL。 IIS本身在域计算机上以test@domain.com的身份运行。禁用匿名访问,并且集成Windows身份验证是进行身份验证的唯一方法。

该服务有一个返回当前Windows身份名称和模拟级别的方法。该方法在其OperationBehaviourAttribute中将Impersonation设置为Required。

[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public IEnumerable<string> GetInformation()
{
    WindowsIdentity identity = WindowsIdentity.GetCurrent();
    return new List<string>()
    {
        identity.Name,
        identity.ImpersonationLevel.ToString()
    };
}

我正在客户端手动构建WCF频道,并允许代理服务。

WSHttpBinding binding = new WSHttpBinding();
binding.Security.Mode = SecurityMode.Transport;
binding.Security.Transport.ClientCredentialType =
    HttpClientCredentialType.Windows;

EndpointAddress endpoint =
    new EndpointAddress("https://host/DelegateService/Service.svc");

ChannelFactory<ServiceInterface.IService> cf =
    new ChannelFactory<ServiceInterface.IService>(binding, endpoint);

cf.Credentials.Windows.AllowedImpersonationLevel =
    TokenImpersonationLevel.Delegation;

ServiceInterface.IService service = cf.CreateChannel();

客户端是完全受信任的XBAP,使用域证书签名,该证书已移至Trusted Publishers证书库。

主机test@domain.com和current@domain.com在域中设置了允许委派,并且没有任何用户被标记为敏感。当模拟起作用时,SeImpersonatePrivilege不应该是问题。

当客户端调用服务方法时,该方法返回“domain \ current”和“Impersonation”。我需要的是“域\当前”和“授权”。根据{{​​3}}的第二个表格,这意味着客户或服务无法授权。

该域具有Windows 2000 Mixed的功能级别。我在某处读到这意味着NTLM身份验证,但我认为这涉及到域控制器之间的流量。如果没有在https上运行,Wireshark会在http响应中显示supportedMech: 1.2.840.48018.1.2.2 (MS KRB5 - Microsoft Kerberos 5),因此似乎已启用Kerberos。

从技术上讲,我们可以将功能级别提升到Windows 2003,因为我们拥有的两个域控制器都是W2K3服务器,但IT部门目前无法为备份操作分配资源,而且他们想要在他们去之前做的事情也是如此。提高功能水平。

我们确实有一个虚拟测试域,可以升级到Windows Server 2003的功能级别,但是这个域缺少证书颁发机构或安装了IIS的客户端计算机,因此可以提出功能级别用于测试目的,设置休息基础设施是相当多的工作。

这是我一段时间以来无法解决的问题。 Web似乎充满了“这就是你如何做”这类文章,但我对这些没有任何好运。有什么想法是错的吗?

1 个答案:

答案 0 :(得分:0)

您是否在同一IIS主机上运行XBAP和服务?

如果我理解正确 - 你有:client-&gt; XBAP-&gt; WCF。

客户端正在连接到IIS上托管的XBAP。这可能是通过Kerberos进行身份验证,你似乎建议它。

然后第二跳是连接到WCF服务的XBAP。如果这两个托管在同一个IIS主机上,则不会尝试使用kerberos,并且将使用NTLM。如果WCF位于另一台主机上,则仅尝试Kerberos

如果您已将XBAP和WCF托管在单独的盒子上,那么您就可以通过第二跳认证设置获得经典的kerberos,并且任何“这就是您如何做”的文章都应该解释它。

(我意识到这个问题是前一段时间了 - 但我最近才找到它并且最近才了解Kerberos和2-hop问题。)