安全上下文和 Active Directory 域服务

当应用程序绑定到 Active Directory 域控制器 (DC) 时,是在安全主体的安全上下文中进行的,安全主体既可以是用户,也可以是计算机或系统服务等实体。 安全上下文是系统在线程尝试访问可保护对象时用来强制执行安全措施的用户帐户。 这些数据包括用户安全标识符 (SID)、用户组成员身份和特权。

用户通过提供用于身份验证的凭据来建立安全上下文。 如果凭据通过了身份验证,系统就会生成一个访问令牌,用于标识与用户帐户相关的群组成员身份和特权。 在尝试访问 Directory 对象时,系统会验证访问令牌。 它将访问令牌中的数据与对象安全描述符授予或拒绝访问的帐户和组进行比较。

使用以下方法控制绑定到 Active Directory DC 的安全上下文:

  • 使用 ADS_SECURE_AUTHENTICATION 选项与 ADsOpenObject 函数或 IADsOpenDSObject::OpenDSObject 方法绑定,并明确指定用户名和密码。 系统会对这些凭据进行身份验证,并生成一个访问令牌,以便在绑定期间用于访问验证。 有关详细信息,请参阅身份验证
  • 使用 ADS_SECURE_AUTHENTICATION 选项进行绑定,但不指定凭据。 如果不模拟用户,则系统会使用应用程序的主要安全上下文,即启动应用程序的用户的安全上下文。 如果是系统服务,则是服务帐户或 LocalSystem 帐户的安全上下文。
  • 模拟用户,然后与 ADS_SECURE_AUTHENTICATION 绑定但不指定凭据。 在这种情况下,系统会使用被模拟客户的安全上下文。 有关详细信息,请参阅客户端模拟
  • 使用 ADsOpenObjectIADsOpenDSObject::OpenDSObjectADS_NO_AUTHENTICATION 选项进行绑定。 此方法无需身份验证即可绑定,并将“Everyone”作为安全上下文。 只有 LDAP 提供程序支持此选项。

如果可能,请绑定而不指定凭据。 也就是说,使用登录用户或模拟客户端的安全上下文。 这样就可以避免缓存凭据。 如果必须使用备用用户凭据,请提示输入凭据并与之绑定,但不要缓存它们。 要在多个绑定操作中使用相同的安全上下文,可以在第一次绑定操作中指定用户名和密码,然后在后续绑定操作中只指定用户名。 有关使用此技术的详细信息,请参阅身份验证

某些安全上下文比其他上下文更强大。 例如,域控制器上的 LocalSystem 帐户具有对 Active Directory 域服务的完整访问权限,而典型用户仅对目录中的某些对象具有有限的访问权限。 通常,当不那么强大的安全上下文足以执行操作时,应用程序不应在强大的安全上下文(如 LocalSystem)中运行。 这意味着可能要把应用程序划分为不同的组件,每个组件都在与要执行的操作相适应的安全上下文中运行。 例如,应用程序设置可以按如下进行划分:

  • 在属于架构管理员组的用户上下文中执行架构更改和扩展。
  • 在企业管理员组成员用户的上下文中执行配置容器更改。
  • 在作为域管理员组成员的用户的上下文中执行域容器更改。