有哪些不同类型的 Windows 令牌以及它们有何不同?

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

What's the difference between a Primary Token and an Impersonation Token的可能重复 【参考方案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。我问过其他相关问题:***.com/questions/9149485/…。你也许能帮到我。 您混淆了许多不相关的问题并编写了完全不正确的内容。今天和 17(或 20)年前。想要对服务进行身份验证的主体(无论是他自己还是其他人)是否必须知道密码与令牌的种类完全无关。 NTLM(在工作组环境中)需要知道密码(或“密码等效哈希”),而 Kerberos(或域中 NTLM 的奇异配置,使用 NTLM 传递)不需要。 模拟令牌“代表 [ing]s 实际登录到另一台计算机的经过身份验证的用户”。令牌始终代表 本地 登录会话。 _TOKEN 结构有一个 TokenId 字段,它是一个 LUID,它代表 locally 唯一标识符。这应该是一个足够大的暗示。它还有一个LogonSession 字段指向相应的_SEP_LOGON_SESSION_REFERENCES 结构。所有这些都代表本地登录。 每次你调用ImpersonateSelf()你都会得到一个附加到当前线程的模拟令牌,并且肯定没有“实际登录到另一台计算机的经过身份验证的用户”。 ImpersonateAnonymousToken()DuplicateToken() 也是如此。我可以继续,但请在我的问题here 中查看正确答案。

以上是关于有哪些不同类型的 Windows 令牌以及它们有何不同?的主要内容,如果未能解决你的问题,请参考以下文章

iOS中都有哪些不同类型的通知以及如何正确配置它们?

(分子生物学)啥是增强子? 它们与其他调控序列有何不同? 增强子具都有哪些特点?

Laravel 迁移字符串(MySQL VarChar)与文本 - 何时使用它们?它们有何不同?

什么是数据类,它们与普通类有何不同?

什么是 重载 ?为什么要重载?有何特点?

Java语言中,构造方法和一般方法有何不同