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. (Я знаю, что это задокументировано, потому что я добавил на страницу документации.)