离线时使用 LsaLogonUser 预先验证用户

问题描述 投票:0回答:1

我有一个具有 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
winapi credential-providers windows-security
1个回答
0
投票

这看起来很愚蠢。我在代码中加入了 AzureAD,检查用户名,然后在检测到电子邮件时用 AzureAD 替换域。如果计算机没有加入 AD,那么默认的“域”是 WORKGROUP...也许没有 bueno...

但是,代码路径并未替代 AzureAD,因此断开连接时会失败...

但是...如果机器已连接,如果域是 WORKGROUP,

LsaLogonUser()
可以验证凭据。对我来说,这更奇怪......

© www.soinside.com 2019 - 2024. All rights reserved.