【问题标题】:What are different types of windows token and how they differ?有哪些不同类型的 Windows 令牌以及它们有何不同?
【发布时间】:2012-02-05 14:15:12
【问题描述】:

最近我一直在处理 windows LogonUser API。 LogonUser api 根据传递给 API 的 dwLogonType 返回不同的令牌。文件提到:

• 该函数返回一个模拟令牌,而不是主令牌。你 不能在 CreateProcessAsUser 函数中直接使用此令牌。 但是,您可以调用 DuplicateTokenEx 函数来转换 令牌到主令牌,然后在 CreateProcessAsUser 中使用它。

• 如果您将令牌转换为主令牌并在 CreateProcessAsUser 启动一个进程,新进程无法访问 其他网络资源,例如远程服务器或打印机,通过 重定向器。一个例外是,如果网络资源不是 访问受控,则新进程将能够访问它。

我对不同的令牌类型完全感到困惑。我想了解什么是不同的 Windows 令牌类型以及它们有何不同?

【问题讨论】:

标签: windows windows-authentication windows-security


【解决方案1】:

从历史上看(比如 17 年前):

如果在服务器 B 上运行的进程作为用户 U 想以同一用户连接到服务器 C,则服务器之间的身份验证协议要求服务器 B 知道用户 U 的密码。

如果用户 U 在服务器 B 上登录,这不是问题(用户必须输入密码)。

但是,假设用户 U 实际上在客户端 A 上登录并连接到服务器 B(可能是邮件服务器)。然后服务器 B 可以安全地确定它确实是用户 U 连接,但服务器 B 永远不会看到 U 的密码,因此它无法代表 U 连接到服务器 C。

这种区别自然会产生两种用户令牌:

  • 代表“真正”登录并可以连接到其他网络资源的用户的主令牌。
  • 一个模拟令牌,代表实际登录到另一台计算机的经过身份验证的用户,因此该令牌不能用于访问其他网络资源(因为操作系统不知道密码,这是服务器间身份验证协议所要求的) )。

在今天,事情变得更加复杂,例如,Kerberos 身份验证支持跨多个服务器的委派,但除非您明确启用此功能,否则上述相同的限制仍然适用。

回到您的问题,您提到的限制仅在您要求LOGON32_LOGON_NETWORK 令牌时适用。正如文档所说,这是不需要访问其他网络资源的网络服务器的快速登录;如果您确实需要此访问权限,请选择其他登录类型。

为了进一步阅读,this article 已过时,但确实涵盖了各种模拟和委托选项。

【讨论】:

  • +1。我问过其他相关问题:stackoverflow.com/questions/9149485/…。你也许能帮到我。
  • 您混淆了许多不相关的问题并编写了完全不正确的内容。今天和 17(或 20)年前。想要对服务进行身份验证的主体(无论是他自己还是其他人)是否必须知道密码与令牌的种类完全无关。 NTLM(在工作组环境中)需要知道密码(或“密码等效哈希”),而 Kerberos(或域中 NTLM 的奇异配置,使用 NTLM 传递)不需要。
  • 模拟令牌“代表 [ing]s 实际登录到另一台计算机的经过身份验证的用户”。令牌始终代表 本地 登录会话。 _TOKEN 结构有一个 TokenId 字段,它是一个 LUID,它代表 locally 唯一标识符。这应该是一个足够大的暗示。它还有一个LogonSession 字段指向相应的_SEP_LOGON_SESSION_REFERENCES 结构。所有这些都代表本地登录。
  • 每次你调用ImpersonateSelf()你都会得到一个附加到当前线程的模拟令牌,并且肯定没有“实际登录到另一台计算机的经过身份验证的用户”。 ImpersonateAnonymousToken()DuplicateToken() 也是如此。我可以继续,但请在我的问题here 中查看正确答案。
猜你喜欢
  • 1970-01-01
  • 2017-07-05
  • 1970-01-01
  • 2017-10-07
  • 1970-01-01
  • 2013-06-23
  • 2010-09-27
相关资源
最近更新 更多