【发布时间】: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 验证。我检查了这个模块的作用并实现了相同的功能。不幸的是,令牌似乎受到限制。但至少你知道它是有效的,你可以读取用户名和用户组成员资格。