模拟级别

如果模拟成功,则表示客户端已在某种程度上同意让服务器成为客户端。 不同程度的模拟称为模拟级别,指示在模拟客户端时向服务器授予的权限。

目前有四个模拟级别:匿名标识模拟委派。 下表简述各个模拟级别:

匿名 (RPC_C_IMP_LEVEL_ANONYMOUS)

客户端对服务器而言是匿名的。 服务器进程可以模拟客户端,但模拟令牌不包含有关客户端的任何信息。 仅本地进程间通信传输支持此级别。 所有其他传输以无提示方式将此级别提升至标识级别。

标识 (RPC_C_IMP_LEVEL_IDENTIFY)

系统默认级别。 服务器可以获取客户端的身份,然后可以模拟客户端进行 ACL 检查。

模拟 (RPC_C_IMP_LEVEL_IMPERSONATE)

服务器可以在代表客户端执行操作时模拟客户端的安全上下文。 服务器可以作为客户端访问本地资源。 本地服务器可以客户端身份访问网络资源。 远程服务器只能访问所在计算机上的资源。

委派 (RPC_C_IMP_LEVEL_DELEGATE)

最高模拟级别。 如果选择了该级别,则服务器(无论是本地的还是远程的)可以在代表客户端的同时模拟客户端的安全上下文。 在模拟期间,可以将客户端的凭据(本地和网络)传递给任意数量的计算机。

若要在委派级别进行模拟,必须满足以下要求:

  • 客户端必须将模拟级别设置为 RPC_C_IMP_LEVEL_DELEGATE。
  • 客户端帐户不得在 Active Directory 服务中标记为“帐户敏感,无法委派”。
  • 服务器帐户必须在 Active Directory 服务中标记“受信任,可委派”属性。
  • 托管客户端、服务器和任何“下游”服务器的计算机都必须在域中运行。

通过选择模拟级别,客户端会告知服务器多久才能模拟客户端。 客户端在用于与服务器通信的代理上设置模拟级别。

设置模拟级别

可通过两种方法设置模拟级别:

通过将适当的 RPC_C_IMP_LEVEL_xxx 值传递给 CoInitializeSecurityCoSetProxyBlanket,通过 dwImpLevel 参数设置模拟级别。

不同的身份验证服务支持不同范围的委派级模拟。 例如,NTLMSSP 支持跨线程和跨进程委派级模拟,但不支持跨计算机模拟。 另一方面,Kerberos 协议支持跨计算机边界的委派级模拟,而 Schannel 不支持任何委托级模拟。 如果在模拟级别有代理,并且想要将模拟级别设置为委派,则应使用除模拟级别以外的每个参数的默认常量调用 SetBlanket。 COM 将在本地选择 NTLM,并在远程选择 Kerberos 协议(Kerberos 协议有效期)。

委派和模拟