我们正在使用内部用户帐户系统开发应用程序,但希望能够使用Active Directory和/或Windows帐户中的凭据 . 为此,我们将用户SID存储在应用程序用户表的字段中 . 我们的登录机制的功能如下:
-
提示用户输入域名,登录名,密码
-
致电LogonUser(logon, domain, password, logon_type, logon_provider, &hToken)
-
如果成功,请从hToken获取用户SID
-
关闭hToken
-
在我们的应用程序数据库中搜索具有给定SID的用户;如果找到,我们将被视为已登录该帐户 .
出现的问题是:我们一直在使用LOGON32_LOGON_NETWORK作为logon_type,但我们现在遇到了一些安全配置,其中“拒绝从网络访问此计算机”,这意味着禁止网络登录类型 .
我的问题是我们应该在这种情况下使用什么登录类型?互动?除了提取用户的SID之外,我们实际上并没有使用Logon令牌 . 我们的应用程序有自己的内部组和权限;我们不以任何方式使用Windows组或权限 . 从Windows和域控制器的角度来看,我们所做的就是登录并快速注销 .
或者我们是以完全错误的方式看待这个,我们应该完全使用其他一些登录方法?
谢谢
3 回答
当 local computer 上没有为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()
.您可以与SSPI服务进行通信,以验证用户的凭据并获取令牌,而无需特殊权限 . 这需要很多模糊的代码和
有关示例,请参阅http://support.microsoft.com/kb/180548;
SSPLogonUser
函数是获取令牌的位置 .惯例是使用LOGON32_LOGON_BATCH,如下所述:
(强调我的) .
系统管理员可能仍需要重新配置服务器以授予对相关用户的批量登录访问权限,但因为这不授予用户访问任何Windows功能的权限(例如,能够使用远程桌面,以连接到网络共享,或以交互方式登录,如果他们以某种方式获得访问控制台)这应该不是一个问题 .