【发布时间】:2015-04-28 05:38:10
【问题描述】:
我们正在开发具有内部用户帐户系统的应用程序,但希望能够使用来自 Active Directory 和/或 Windows 帐户的凭据。为此,我们将用户 SID 存储在应用程序用户表的字段中。我们的登录机制是这样的:
- 提示用户输入域、登录名、密码
- 致电LogonUser(logon, domain, password, logon_type, logon_provider, &hToken)
- 如果成功,从 hToken 获取 User SID
- 关闭 hToken
- 在我们的应用程序数据库中搜索具有给定 SID 的用户;如果找到,我们将被视为已登录该帐户。
出现的问题是:我们一直使用LOGON32_LOGON_NETWORK作为logon_type,但现在我们遇到了一些“从网络访问这台计算机”被拒绝的安全配置,这意味着网络登录类型被禁止。
我的问题是在这种情况下我们应该使用什么登录类型?交互的?除了提取用户的 SID 之外,我们实际上并没有将登录令牌用于其他任何事情。我们的应用程序有自己的内部组和权限;我们不以任何方式使用 Windows 组或权限。从 Windows 和域控制器的角度来看,我们所做的只是登录和快速注销。
或者我们是否以完全错误的方式看待这个问题,我们应该完全使用其他登录方法?
谢谢
【问题讨论】:
-
这是桌面应用程序还是网络应用程序?为什么不使用 Kerberos 针对 AD 对用户进行身份验证?
-
桌面。我们已经编写了登录内容,我们希望只需要更改一个参数。除了 AD 之外,我们还希望能够使用本地 Windows 帐户。
-
桌面?那么用户已经登录了吗?为什么您的应用程序需要他们再次登录,为什么不直接使用现有的 SID? (更重要的是,您确实意识到用户将能够轻松绕过您的登录机制并像任何其他用户一样登录到您的应用程序?)
-
LogonUser 调用发生在 SYSTEM 帐户上运行的服务中。我看不出他们如何能够在没有计算机管理员权限的情况下欺骗 SID。
-
是的,如果它是一项服务就可以了。在那里草草下结论,对不起。而且由于用户必须以交互方式登录,LOGON32_LOGON_INTERACTIVE 是一个非常明智的选择。但是请注意,命名管道(和大多数其他 IPC 机制)允许您确定用户的身份,而无需重新验证他们的身份。
标签: c++ windows security authentication active-directory