验证当前经过身份验证的Windows用户是否具有委派权限

时间:2013-03-13 08:18:12

标签: c# wcf windows-authentication impersonation

鉴于我有一个使用Windows身份验证的WCF服务,我想模仿它们并调用另一个WCF服务,如下所示:

using (ServiceSecurityContext.Current.WindowsIdentity.Impersonate())
{
    // call another WCF service
}

我已经设置了所有配置设置并且工作正常,只要在客户端,它们包含以下行:

client.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Delegation;

但是,在尝试拨打用户令牌具有委派权限的呼叫之前,我该如何验证?即我无法控制的客户端设置了AllowedPersonationLevel?

如果他们没有设置它,会抛出各种奇怪的异常(比如无法加载程序集X等)。

理想情况下,我希望能够做到以下几点:

using (ServiceSecurityContext.Current.WindowsIdentity.Impersonate())
{
    if (UserDoesntHaveDelegationRights())
        throw new SecurityException("No delegation rights");

    // call another WCF service
}

请注意,WindowsIdentity.GetCurrent().ImpersonationLevel始终等于TokenImpersonationLevel.Impersonation,因此不幸的是,这不是一个选项。

2 个答案:

答案 0 :(得分:5)

定义中可能存在一些混淆。就impersonation levels而言,Windows身份可以是:

  • 模拟 - 服务可以在本地模拟用户
  • 委派 - 服务可以远程模拟用户

委派的能力如此强大,以至于它在Active Directory中受到高度限制:

  1. 客户必须允许委派
  2. 执行委派的服务帐户必须在Active Directory中标记为“信任委派”。
  3. 以下是enable an account for delegation的方法。它需要Active Directory域管理员才能进行更改。我曾经工作的每个公司环境都有一个不允许委托的政策。

    回到你的问题:

    因此,虽然TokenImpersonationLevel.Delegation存在,但它被视为安全风险,很少(如果曾经)使用过。 TokenImpersonationLevel.Impersonation是您可能获得的最高级别。

    TokenImpersonationLevel.Impersonation很有用。您仍然可以作为模拟用户连接到数据库或进行远程服务调用。但是远程服务(不在同一个盒子上)不能再次冒充用户。基本的经验法则是“假冒可以使两台机器跳跃”。如果用户的凭证必须“跳”得更远,它就会失败。

    如果需要在许多服务器之间传递用户凭据,最佳选择是联合安全模型,例如Windows Identity Foundation(WIF)。请参阅Identity Management in Active Directory

答案 1 :(得分:0)

怎么样?
if (WindowsIdentity.GetCurrent().ImpersonationLevel != TokenImpersonationLevel.Delegation) ...