我有一个具有 MFA 代码和离线 MFA 代码的凭证提供商。当然,凭据提供程序是一个 DLL,并在 NT Authority\System 下的系统应用程序中运行。我不想以任何方式修改令牌。我认为如果它在登录过程中运行,它可能拥有所需的所有权限...尽管这可能不是真的...
我想预先验证用户帐户,这样如果用户输入了错误的用户名或密码,我们就不会强制用户执行 MFA。当您完成 MFA 流程,在接口回调
ICredentialProviderCredential::GetSerializaion
中序列化信用信息,然后在 ICredentialProverCredential::ReportResults
中报告不良信用信息,并且您必须重复这个循环时,这很烦人……至少在我们当前的流程中是这样。
我正在调用
LsaLogonUser
,登录类型为 SECURITY_LOGON_TYPE::Interactive
,身份验证包为 MSV1_0_PACKAGE_NAME
。如果计算机在线,它总是可以工作——返回 STATUS_NOERROR
表示良好的信用,返回 STATUS_LOGON_FAILURE
表示登录失败。我什至尝试过其他一些登录类型,认为 SECURITY_LOGON_TYPE::CachedInteractive
登录类型可能会起作用...但是对于正确和错误的密码都会返回不受支持的错误代码。
如果我离线,本地帐户仍然会通过
LsaLogonUser
调用,但是 AzureAD 帐户会失败。我想我已经测试过AD加入的机器断开连接,但需要回去测试。现在我只是想解决 AzureAD 问题。
我正在做一个不受信任的连接来填充
LsaLogonUser
的第一个参数
...
LsaConnectUntrusted
也许可能有问题???
LsaLoginUser w/本地帐户 | LsaLogonUser w/AzureAD 帐户 | |
---|---|---|
在线 | 成功 | 成功 |
离线 | 成功 | 失败 |
--------------------- 编辑添加信息------------------------
从一开始我就知道其中一些登录类型是不正确的,但决定对它们进行全部测试 - 一分钱一分货。
登录类型 | 错误讯息 | Nt状态 | NtSubstatus |
---|---|---|---|
互动 | 用户名或密码不正确。 (1326) | c000006d | 0 |
网络 | 用户名或密码不正确。 (1326) | c000006d | 0 |
批量 | 用户名或密码不正确。 (1326) | c000006d | 0 |
服务 | 用户名或密码不正确。 (1326) | c000006d | 0 |
代理 | 登录请求包含无效的登录类型值。 (1367) | c000010b) | 0 |
解锁 | 用户名或密码不正确。 (1326) | c000006d | 0 |
网络明文 | 用户名或密码不正确。 (1326) | c000006d | 0 |
新凭证 | 登录请求包含无效的登录类型值。 (1367) | c000010b) | 0 |
远程互动 | 用户名或密码不正确。 (1326) | c000006d | 0 |
缓存互动 | 不支持该请求。 (50) | c00000bb | 0 |
缓存远程交互 | 用户名或密码不正确。 (1326) | c000006d | 0 |
缓存解锁 | 登录请求包含无效的登录类型值。 (1367) | c000010b) | 0 |
这看起来很愚蠢。我在代码中加入了 AzureAD,检查用户名,然后在检测到电子邮件时用 AzureAD 替换域。如果计算机没有加入 AD,那么默认的“域”是 WORKGROUP...也许没有 bueno...
但是,代码路径并未替代 AzureAD,因此断开连接时会失败...
但是...如果机器已连接,如果域是 WORKGROUP,
LsaLogonUser()
可以验证凭据。对我来说,这更奇怪......