【问题标题】:Validating Windows access token on a different computer在另一台计算机上验证 Windows 访问令牌
【发布时间】:2019-02-18 06:52:49
【问题描述】:

我正在开发一个客户端/服务器应用程序(客户端和服务器都用 C++ 编写并在 Windows 计算机上运行)。 我需要在服务器计算机上授权客户端计算机的当前用户,但不需要用户输入他的密码。

在 Windows 中,您拥有当前运行进程的访问令牌。您还可以检查为该令牌分配了哪个用户以及它在哪个组中,等等。 我想将该令牌发送到我的服务器应用程序并在那里针对域控制器进行验证。在 Windows 中是否可能发生这样的事情?

我想象这样一个场景:客户端应用程序生成一个令牌,可以根据域控制器验证该令牌是由该用户生成的,并且在几分钟内有效。然后令牌将被序列化并发送到我的服务器应用程序(即通过 REST API)。然后我的服务器反序列化该令牌并使用 Windows API 针对域控制器验证生成的令牌。域控制器还提供其他信息,例如该令牌中包含的用户名。

这可能吗?我找到了类似“Windows Identity Foundation”和“AuthZ”API 的东西,但它似乎不适合?

【问题讨论】:

  • 我正在尝试做这件事。在此站点上的其他答案中,WIF 的 WindowsIdentity.getCurrent() 函数返回一个“预先验证”的令牌,这完全是无意义的。安全令牌应该包含发行者的数字签名,以便令牌可以被任何获得它的东西验证为来自发行者。 WIF 和 ADFS 到处都宣传为“基于声明和联合”,但忘记实现应用程序验证对其提出的任何声明的能力。我敢打赌,Windows 目前无法执行您所描述的操作。
  • 同时我找到了一个解决方案:sourceforge.net/projects/mod-auth-sspi 在这个 apache 模块中,通过 NTLM/Negotiate 实现了 Kerberos 验证。我检查了这个模块的作用并实现了相同的功能。不幸的是,令牌似乎受到限制。但至少你知道它是有效的,你可以读取用户名和用户组成员资格。

标签: c++ windows token


【解决方案1】:

您可以做到,ADFS 和 NTLM 支持这一点,但请查看 this article,这是一本关于如何做到这一点的好书。

【讨论】:

  • 您的文章正好相反“用户的登录会话对于他们的工作站来说是唯一的......他们不能简单地通过网络发送他们的访问令牌。令牌将毫无意义,因为它不对应远程主机上的有效登录会话。...此身份验证机制 [是] 重放攻击的目标。”他们谈论使用 Kerberos 创建网络登录,而不是我引用“网络登录不缓存凭据......因此......不能使用......令牌来验证另一个远程主机。这是...... “双跳”问题。”
猜你喜欢
  • 1970-01-01
  • 2015-02-10
  • 1970-01-01
  • 2019-01-03
  • 1970-01-01
  • 2014-02-19
  • 2011-11-10
  • 2018-10-13
相关资源
最近更新 更多