有哪些不同类型的 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 令牌以及它们有何不同?的主要内容,如果未能解决你的问题,请参考以下文章
(分子生物学)啥是增强子? 它们与其他调控序列有何不同? 增强子具都有哪些特点?