【问题标题】:C++ Windows Credential Provider Error ScreenC++ Windows 凭据提供程序错误屏幕
【发布时间】:2019-01-17 13:05:11
【问题描述】:

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

编辑:我这样做是这样的:

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

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

【问题讨论】:

  • 发布您的代码以澄清
  • 您在哪里使用 REST API 进行身份验证?你在GetSerialization()里面做吗?
  • 是的,我在 GetSerialization() 里面做
  • @MunkhdelgerTumenbayar 有什么建议吗?
  • @SaileshD 我在 GetSerialization() 中执行此操作。你能帮忙吗?

标签: c++ windows credential-providers


【解决方案1】:

一定要试试

*pcpgsr = CPGSR_NO_CREDENTIAL_NOT_FINISHED;

在我的用例中还有额外的

*pcpsiOptionalStatusIcon = CPSI_WARNING;

显示状态信息就足够了。

【讨论】:

    【解决方案2】:
    ReportResult(
        NTSTATUS ntsStatus, 
        NTSTATUS ntsSubstatus,
        PWSTR* ppwszOptionalStatusText, 
        CREDENTIAL_PROVIDER_STATUS_ICON* pcpsiOptionalStatusIcon
        )
    

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

    例如,在检查ntsStatus 后,您可以这样自定义

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

    编辑:

    GetSerialization()内部,一旦API返回失败,将CREDENTIAL_PROVIDER_GET_SERIALIZATION_RESPONSE设置为未完成。像这样

    *pcpgsr = CPGSR_RETURN_NO_CREDENTIAL_FINISHED;

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

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

    【讨论】:

    • 好的,但我认为 ntsStatus 在登录失败后由 LSA 引发(如果错误请纠正我)。但是我需要在我的 REST API 调用失败后检测到它。我是否必须提高自定义 ntsStatus 并在之后检测它?
    • 我是这样做的:
    • 我已经编辑了这个问题并包含了我正在做的代码
    • 我已包含 *pcpgsr = CPGSR_RETURN_NO_CREDENTIAL_FINISHED; API 返回失败的地方。现在登录停止,但未显示错误,并且不建议使用凭据提供程序
    • 有什么建议吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 2021-09-16
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多