【问题标题】:Delegation in WCF web serviceWCF Web 服务中的委派
【发布时间】:2009-04-26 11:26:38
【问题描述】:

我有一个 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,使用已移至 Trusted Publishers 证书存储区的域证书签名。

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

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

域的功能级别为 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 的客户端计算机,因此虽然可以出于测试目的提高功能级别,但设置休息基础设施的工作量很大。

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

【问题讨论】:

    标签: c# wcf ssl active-directory xbap


    【解决方案1】:

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

    如果我理解正确 - 你有:client->XBAP->WCF。

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

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

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

    (我意识到这个问题是很久以前的事了 - 但我最近才发现它,直到最近才了解 Kerberos 和 2-hop 问题。)

    【讨论】:

    • 基本问题不久前得到解决。这里使用 XBAP 的场景应该是重现缺乏身份验证的最简单方法,所以我丢失了这个设置,无法测试它出了什么问题。虽然现在我对托管在 IIS 部分的 XBAP 感到好奇:XBAP 的起源很重要,即使对于完全受信任的 XBAP 也是如此?我承认我对它们没有深入研究,但假设它们在网络方面表现得像任何独立的 .Net 应用程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多