Win32: CredUIConfirmCredentials ведет себя неожиданно

Я использую CredUIConfirmCredentials в сочетании с CredUIPromptForCredentials.

Я установил EXPECT_CONFIRMATION и когда учетные данные впервые предоставляются пользователем, вызов CredUIConfirmCredentials возвращает NO_ERROR, как и ожидалось.

Однако на всех последующих звонках CredUIConfirmCredentialsс теми же учетными данными возвращается ERROR_INVALID_PARAMETER. Это описывается документами SDK как:

Попытка подтвердить учетные данные ожидания не удалась, потому что учетные данные содержали недопустимые или противоречивые данные.

что довольно странно, поскольку они представляют собой те же учетные данные, которые были успешно сохранены изначально.

Тот же результат возвращается, если вы вводите другой пароль для того же имени пользователя. Что еще более запутанно, так это то, что новые учетные данные фактически сохраняются, что, по-видимому, указывает на то, что возвращаемое значение фактически указывает на то, что сохраненные учетные данные были перезаписаны, а не на том, что произошла ошибка. Я что-то упустил или документация неверна?


Фон

Вы можете использовать систему учетных данных Windows для хранения учетных данных для вашего собственного приложения. Вы говорите Windows, что хотите запросить " общие " учетные данные для некоторой " цели ":

псевдокод:

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

Затем Windows отобразит диалоговое окно:

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

Тогда ваша задача - проверить учетные данные, введенные пользователем. Если они действительны, вы сообщите об этом Windows, вызвав ConfirmCredentials. Это необходимо для сохранения только действительных учетных данных:

CredUIConfirmCredentials("My Application", true);

Как только учетные данные будут подтверждены как действительные, Windows сохранит их в безопасном хранилище, которое вы можете увидеть через Панель управления:

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

Ключевые слова: credui, CredUIConfirmCredentials

1 ответ

Решение

Я нашел ответ: по замыслу

CredUIConfirmCredentials вернет ошибку "когда нечего делать". Это означает:

  • если учетные данные такие же, как в хранилище учетных данных
  • пользователь не проверял Rembember my password флажок
  • Вы не установили CREDUI_FLAGS_EXPECT_CONFIRMATION флаг

Дело в том, что CredUIConfirmCredentials не удается, когда учетные данные совпадают с теми, которые уже находятся в хранилище, задокументированном на MSDN. (Я знаю, что это задокументировано, потому что я добавил на страницу документации.)

Другие вопросы по тегам