Win32:CredUIConfirmCredentials意外行为

时间:2010-01-26 19:42:53

标签: windows security credentials credui

我正在使用CredUIConfirmCredentials CredUIPromptForCredentials

I设置EXPECT_CONFIRMATION,当凭据第一次时提供 用户对CredUIConfirmCredentials的调用按预期返回 NO_ERROR

然而,在对CredUIConfirmCredentials的所有后续调用中,都是相同的 凭据,返回 ERROR_INVALID_PARAMETER 。这由the SDK docs as描述:

  

尝试确认等待   凭证失败,因为   凭证包含无效或   不一致的数据。

这相当令人困惑,因为它们与最初成功保存的凭据完全相同。

如果您输入相同的不同密码,则会返回相同的结果 用户名。更令人困惑的是,新的凭证是 实际上是持久的 - 这似乎表明返回值是 实际上表明持久化的凭据被覆盖 - 不是 那是一个错误。我错过了什么,或者是文档 不正确的?


背景

您可以使用Window的凭据系统来存储您自己的应用程序的凭据。您告诉Windows,您要为某些“目标”提示“通用”凭据:

伪码:

CredUIPromptForCredentials("My Application", ref username, ref password);
然后

将导致Windows显示一个对话框:

alt text http://i50.tinypic.com/28a1gdi.jpg

然后,您的工作是检查用户输入的凭据。如果它们有效,您可以通过调用 ConfirmCredentials 告诉Windows。这是为了确保只保存有效的凭据:

CredUIConfirmCredentials("My Application", true);

一旦确认凭据有效,Windows就会将它们保存在安全存储中,您可以通过控制面板查看:

alt text http://i48.tinypic.com/2vi3wxu.jpg

关键词:credui,CredUIConfirmCredentials

1 个答案:

答案 0 :(得分:1)

我找到答案:按设计

CredUIConfirmCredentials会在“无事可做”时返回错误。这意味着:

  • 如果凭据与凭证存储中已有的凭据相同
  • 用户未选中Rembember my password复选框
  • 您没有设置CREDUI_FLAGS_EXPECT_CONFIRMATION标志

当凭据与MSDN上记录的商店中已有的凭据相同时,CredUIConfirmCredentials失败。 (我知道它已被记录,因为我已添加到the documentation page。)