C++ Windows 凭据提供程序错误屏幕

C++ Windows Credential Provider Error Screen

我已经为 MFA 开发了一个自定义凭证提供程序,它运行良好。我正在通过调用 REST APIs 在 GetSerialization() 方法中执行额外的身份验证检查。现在,如果通过 REST API 成功验证,我将允许用户登录。但是对于验证失败的情况,我想显示错误屏幕,就像一个默认提供程序在用户名或密码不正确时显示的那样(有一个 'Ok' 按钮)。我知道这是在登录失败的情况下默认凭据提供程序在 ReportResult() 中完成的。我可以调用 ReportResult() 以使用 'Ok' 按钮显示我的自定义错误消息吗? 此致,

编辑:我是这样做的:

if (SUCCEEDED(HRESULT_FROM_NT(ntsStatus)) && SUCCEEDED(HRESULT_FROM_NT(ntsSubstatus)))
{
    SHStrDupW(L"Bad password", ppwszOptionalStatusText);
    *pcpsiOptionalStatusIcon = CPSI_ERROR;
}

但是屏幕没有停止。它登录用户。我需要检测 windows 凭据正确但 API 调用失败的情况,因此我需要捕获该状态并显示错误

ReportResult(
    NTSTATUS ntsStatus, 
    NTSTATUS ntsSubstatus,
    PWSTR* ppwszOptionalStatusText, 
    CREDENTIAL_PROVIDER_STATUS_ICON* pcpsiOptionalStatusIcon
    )

您可以通过填充 ppwszOptionalStatusText 来设置您自己的自定义消息。如果需要,也可以将图标 pcpsiOptionalStatusIcon 设置为 CPSI_ERRORCPSI_WARNINGCPSI_SUCCESS 之一。

例如,勾选 ntsStatus 后,您可以像这样自定义

SHStrDupW(L"Bad password", ppwszOptionalStatusText);
*pcpsiOptionalStatusIcon = CPSI_ERROR;

编辑:

里面GetSerialization(),一旦APIreturns失败,设置CREDENTIAL_PROVIDER_GET_SERIALIZATION_RESPONSE未完成。像这样

*pcpgsr = CPGSR_RETURN_NO_CREDENTIAL_FINISHED;

这应该会停止登录以继续。

编辑 2: 根据下面的@js.hrt 评论,要显示来自 GetSerialization 的状态屏幕,请使用 *pcpgsr = CPGSR_NO_CREDENTIAL_NOT_FINISHED; SHStrDupW(L"Bad password", ppwszOptionalStatusText); *pcpsiOptionalStatusIcon = CPSI_ERROR;在 GetSerialization() 中而不使用报告结果。

一定要试试

*pcpgsr = CPGSR_NO_CREDENTIAL_NOT_FINISHED;

在我的用例中有额外的

*pcpsiOptionalStatusIcon = CPSI_WARNING;

显示状态信息就够了。