仅使用 LogonUser() 来验证凭据
Using LogonUser() only to Validate Credentials
我们正在开发具有内部用户帐户系统的应用程序,但希望能够使用来自 Active Directory and/or Windows 帐户的凭据。为此,我们将用户 SID 存储在应用程序用户 table 的一个字段中。我们的登录机制功能如下:
- 提示用户输入域、登录名、密码
- 致电LogonUser(logon, domain, password, logon_type, logon_provider, &hToken)
- 如果成功,从 hToken 获取用户 SID
- 关闭 hToken
- 在我们的应用程序数据库中搜索具有给定 SID 的用户;如果找到,我们将被视为登录到该帐户。
出现的问题是:我们一直在为 logon_type 使用 LOGON32_LOGON_NETWORK,但我们现在 运行 进入一些安全配置,其中 "Access this computer from the network"被拒绝,意味着网络登录类型被禁止。
我的问题是在这种情况下我们应该使用什么登录类型?交互的?除了提取用户的 SID 之外,我们实际上并没有将登录令牌用于任何其他用途。我们的应用程序有自己的内部组和权限;我们不以任何方式使用 Windows 组或权限。从 Windows 和域控制器的角度来看,我们所做的只是登录和快速注销。
或者我们是否以完全错误的方式看待这个问题,我们应该完全使用其他一些登录方法?
谢谢
您可以与 SSPI 服务通信以验证用户的凭据并获取令牌,而无需特殊权限。这需要大量晦涩难懂的代码和
示例见http://support.microsoft.com/kb/180548; SSPLogonUser
函数是获取令牌的地方。
惯例是使用 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()
。
我们正在开发具有内部用户帐户系统的应用程序,但希望能够使用来自 Active Directory and/or Windows 帐户的凭据。为此,我们将用户 SID 存储在应用程序用户 table 的一个字段中。我们的登录机制功能如下:
- 提示用户输入域、登录名、密码
- 致电LogonUser(logon, domain, password, logon_type, logon_provider, &hToken)
- 如果成功,从 hToken 获取用户 SID
- 关闭 hToken
- 在我们的应用程序数据库中搜索具有给定 SID 的用户;如果找到,我们将被视为登录到该帐户。
出现的问题是:我们一直在为 logon_type 使用 LOGON32_LOGON_NETWORK,但我们现在 运行 进入一些安全配置,其中 "Access this computer from the network"被拒绝,意味着网络登录类型被禁止。
我的问题是在这种情况下我们应该使用什么登录类型?交互的?除了提取用户的 SID 之外,我们实际上并没有将登录令牌用于任何其他用途。我们的应用程序有自己的内部组和权限;我们不以任何方式使用 Windows 组或权限。从 Windows 和域控制器的角度来看,我们所做的只是登录和快速注销。
或者我们是否以完全错误的方式看待这个问题,我们应该完全使用其他一些登录方法?
谢谢
您可以与 SSPI 服务通信以验证用户的凭据并获取令牌,而无需特殊权限。这需要大量晦涩难懂的代码和
示例见http://support.microsoft.com/kb/180548; SSPLogonUser
函数是获取令牌的地方。
惯例是使用 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()
。