3

我有一个 WCF Web 服务,目前通过具有传输安全性和 Windows 客户端凭据类型的 WSHttpBinding 端点提供服务。该服务托管在 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,该域证书已移至受信任的发布者证书存储区。

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

当客户端调用服务方法时,该方法返回“domain\current”和“Impersonation”。我需要的是“域\当前”和“委托”。根据http://msdn.microsoft.com/en-us/library/ms730088.aspx上的第二个表,这意味着客户端或服务无法委派。

该域具有 Windows 2000 Mixed 的功能级别。我在某处读到这意味着 NTLM 身份验证,但我相信这指的是域控制器之间的流量。当不在 https 上运行时,WiresharksupportedMech: 1.2.840.48018.1.2.2 (MS KRB5 - Microsoft Kerberos 5)会在 http 响应中显示,因此似乎启用了 Kerberos。

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

我们确实有一个虚拟测试域,可以升级到 Windows Server 2003 的功能级别,但是该域缺少证书颁发机构或安装了 IIS 的客户端计算机,因此可以提高功能级别以进行测试,设置其余的基础架构工作量很大。

这是我一段时间以来一直无法解决的问题。网络上似乎到处都是“这就是你的做法”之类的文章,但我对这些没有任何运气。有什么想法有什么问题吗?

4

1 回答 1

0

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

如果我理解正确 - 你有:客户端-> XBAP-> WCF。

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

第二个跃点是连接到 WCF 服务的 XBAP。如果这两个托管在同一 IIS 主机上,则不会尝试使用 kerberos,而是使用 NTLM。仅当 WCF 在另一台主机上时才会尝试使用Kerberos 。

如果您将 XBAP 和 WCF 托管在单独的盒子上,那么您就有了经典的 kerberos over 2nd hop 身份验证设置,并且任何“这就是你如何做”的文章都应该解释它。

(我意识到这个问题是前段时间 - 但我最近才发现它,直到最近才了解 Kerberos 和 2-hop 问题。)

于 2010-12-24T10:04:36.180 回答