可能的重复:
在客户端-服务器应用程序中使用 Active Directory 对用户进行身份验证 https://stackoverflow.com/questions/1337923/authenticating-users-using-active-directory-in-client-server-application
我正在使用非托管 C++ 在程序中尝试使用单点登录方法,并且需要确定当前 Windows 用户是否在我的域中经过身份验证。如果我能找到一种方法来知道用户已通过身份验证,我将允许他进入我的桌面应用程序而无需密码(用户名在我的应用程序和域中是相同的)。
我可以使用以下方式直接针对 Active Directory 进行身份验证ADsOpenObject() http://msdn.microsoft.com/en-us/library/aa772238,但这需要用户名、密码和权限,我只需要使用用户名来完成,而不需要用户自己输入。
通过 .net,我可以使用 System.DirectoryServices 中的某些内容,例如this https://stackoverflow.com/questions/4304565/how-to-check-if-a-user-exists-on-ldap thread.
据我所知,此任务可能涉及分析 Windows 安全 kerberos 令牌才能正确执行。这在this https://stackoverflow.com/questions/7111618/win32-how-to-validate-credentials-against-active-directory线程并触及Javathis https://stackoverflow.com/questions/545667/how-to-use-windows-login-for-single-sign-on-and-for-active-directory-entries-for线。虽然我不需要严格的 SSO,因为我的应用程序不会尝试访问与域相关的任何内容。
SSPI 票证方式是唯一的方式吗?或者我可以利用 ADSI/WinLogon/CredentialsCache 的某些属性来使其工作吗?
这是一种非常简单的方法,但是如果您检查用户的环境变量:
在工作组上:
COMPUTERNAME=JPBHPP2
LOGONSERVER=\\JPBHPP2
USERDOMAIN=JPBHPP2
在域上
COMPUTERNAME=WM2008R2ENT
LOGONSERVER=\\WM2008R2ENT
USERDNSDOMAIN=DOM.FR
USERDOMAIN=DOM
这里不太明显,因为用户已登录服务器,但USERDOMAIN
不同于COMPUTERNAME
还有获取用户名Ex http://msdn.microsoft.com/en-us/library/windows/desktop/ms724435%28v=vs.85%29.aspx可以完成这项工作的 API
BOOLEAN WINAPI GetUserNameEx(
__in EXTENDED_NAME_FORMAT NameFormat,
__out LPTSTR lpNameBuffer,
__inout PULONG lpnSize
);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)