编辑:谢谢@RbMm 的澄清问题!
我正在凭据提供程序(而不是包装程序提供程序)中实现 MFA。我必须支持的选项之一是验证使用相同的 UPN 登录计算机并使用 MFA 提供程序进行验证。我使用 LsaLogonUser、ImpersonateLoggedOnUser 和 GetUserNameEx(UserNamePrincipal) 来获取此信息。这适用于大多数环境;但是,在连接到混合 Azure AD 域的计算机上,LsaLogonUser 失败。这导致了一项调查,其结果详述如下:
我有一台属于 AzureAD 混合域的计算机,但我无法从 AzureAD 域名中获取与 SAM 兼容的域名。例如,我可以使用 AzureAD upn 为的用户登录,例如,sake user@domain.com。SAM 兼容的名称是 localdomain\localuser。GetUserNameEx(NameUserPrincipal) reutrns user@domain.com GetUserNameEx(NameSamCompatible) 返回 localdomain\localuser 但是在以下代码中,TranslateName 失败,GetLastError() 返回 ERROR_NO_SUCH_DOMAIN。
TCHAR validBuffer[MAX_PATH+1];
ULONG nValidSize = MAX_PATH;
TranslateName("user@domain.com", NameUserPrincipal, NameSamCompatible, validBuffer, &nValidSize);
我还尝试了以下 API,但均未成功,它们都以不同的返回值失败:
GetComputerObjectName失败,将任何值传递给 NameFormat
对于 NameType的任何相关值,GetCompterNameEx失败并显示 ERROR_CANT_ACCESS_DOMAIN_INFO
NetWkstaGetInfo不会在任何字段中返回任何有用的信息
此外,如果您在此 PC > 属性 > 高级系统属性中查看计算机的加入信息,您会将其视为工作组的一部分,而不是域。-如果您运行dsregcmd /status命令:
- 在上述用户的登录会话中执行:“诊断”部分在输出中列出了本地域
- 从使用 LocalSystem 帐户运行的命令提示符执行,输出不会在任何地方列出本地域。
重要的一点(感谢@RbMm) - 使用“其他用户”磁贴时,代码为 Windows 凭据提供程序提供服务。我正在尝试使用 LsaLogonUser 预先验证输入的凭据,然后在我的 ICredentialProviderCredential2::GetSerialization 实现中成功序列化它们。使用 'user@domain.com' 失败,而使用 'localdomain\user@domain.com' 或 'localdomain\localuser' 成功。使用 Windows 的内置密码提供程序登录时,当然可以使用“user@domain.com”。也许我应该为 LsaLogonUser 使用不同的身份验证包?
我被难住了。
感谢任何人的帮助..
- 乌列尔