仅使用 LogonUser() 来验证凭据

Using LogonUser() only to Validate Credentials

我们正在开发具有内部用户帐户系统的应用程序,但希望能够使用来自 Active Directory and/or Windows 帐户的凭据。为此,我们将用户 SID 存储在应用程序用户 table 的一个字段中。我们的登录机制功能如下:

出现的问题是:我们一直在为 logon_type 使用 LOGON32_LOGON_NETWORK,但我们现在 运行 进入一些安全配置,其中 "Access this computer from the network"被拒绝,意味着网络登录类型被禁止。

我的问题是在这种情况下我们应该使用什么登录类型?交互的?除了提取用户的 SID 之外,我们实际上并没有将登录令牌用于任何其他用途。我们的应用程序有自己的内部组和权限;我们不以任何方式使用 Windows 组或权限。从 Windows 和域控制器的角度来看,我们所做的只是登录和快速注销。

或者我们是否以完全错误的方式看待这个问题,我们应该完全使用其他一些登录方法?

谢谢

您可以与 SSPI 服务通信以验证用户的凭据并获取令牌,而无需特殊权限。这需要大量晦涩难懂的代码和

示例见http://support.microsoft.com/kb/180548SSPLogonUser 函数是获取令牌的地方。

惯例是使用 LOGON32_LOGON_BATCH,如记录:

This logon type is intended for batch servers, where processes may be executing on behalf of a user without their direct intervention. This type is also for higher performance servers that process many plaintext authentication attempts at a time, such as mail or web servers.

(强调我的)。

系统管理员可能仍需要重新配置服务器以向相关用户授予批量登录访问权限,但由于这不会授予用户对任何 Windows 功能的访问权限(例如,使用远程桌面,连接到网络共享,或者以交互方式登录(如果他们以某种方式获得对控制台的访问权限)这应该不是问题。

我还惊讶地发现,当 本地计算机上的 Everyone 没有授予用户权限 "Access this computer from the network" 时,LOGON32_LOGON_NETWORK 类型的 LogonUser() 失败.

我使用以下解决方法:

  • 首先尝试使用 LOGON32_LOGON_NETWORK 类型 LogonUser()
  • 如果失败并出现错误 ERROR_LOGON_TYPE_NOT_GRANTED,请使用 LOGON32_LOGON_NEW_CREDENTIALS 类型和 LOGON32_PROVIDER_WINNT50 登录提供程序调用 LogonUser()