0

编辑:谢谢@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 使用不同的身份验证包?

我被难住了。

感谢任何人的帮助..

  • 乌列尔
4

0 回答 0