Запросить у пользователя учетные данные
Возможно, приложению потребуется запрашивать у пользователя имя пользователя и пароль, чтобы избежать хранения пароля администратора или убедиться, что маркер содержит соответствующие привилегии.
Однако простой запрос учетных данных учит пользователей предоставлять их в любое случайное непознанное диалоговое окно на экране. Для уменьшения эффекта обучения рекомендуется выполнить следующую процедуру.
Для правильного получения учетных данных пользователя
- Сообщите пользователю, используя сообщение, которое явно является частью приложения, что он увидит диалоговое окно, которое запрашивает имя пользователя и пароль. Можно также использовать структуру CREDUI_INFO для вызова CredUIPromptForCredentials для передачи данных или сообщения.
- Вызов CredUIPromptForCredentials. Обратите внимание, что максимальное количество символов, указанных для имени пользователя и пароля, включает в себя завершающийся пустой символ.
- Вызовите CredUIParseUserName и CredUIConfirmCredentials, чтобы убедиться, что вы получили соответствующие учетные данные.
В следующем примере показано, как вызывать CredUIPromptForCredentials запрашивать у пользователя имя пользователя и пароль. Начинается заполнение структуры CREDUI_INFO сведениями о том, какие запросы следует использовать. Затем код заполняет два буфера нулями. Это делается, чтобы убедиться, что информация не передается функции, которая может показать старое имя пользователя или пароль пользователю. Вызов CredUIPromptForCredentials вызывает появление диалогового окна. В целях безопасности в этом примере используется флаг CREDUI_FLAGS_DO_NOT_PERSIST, чтобы операционная система не сохраняла пароль, поскольку он может быть раскрыт. Если ошибок нет, CredUIPromptForCredentials заполняет переменные pszName и pszPwd и возвращает ноль. Когда приложение завершит использование учетных данных, оно должно поместить нули в буферы, чтобы предотвратить случайное раскрытие информации.
CREDUI_INFO cui;
TCHAR pszName[CREDUI_MAX_USERNAME_LENGTH+1];
TCHAR pszPwd[CREDUI_MAX_PASSWORD_LENGTH+1];
BOOL fSave;
DWORD dwErr;
cui.cbSize = sizeof(CREDUI_INFO);
cui.hwndParent = NULL;
// Ensure that MessageText and CaptionText identify what credentials
// to use and which application requires them.
cui.pszMessageText = TEXT("Enter administrator account information");
cui.pszCaptionText = TEXT("CredUITest");
cui.hbmBanner = NULL;
fSave = FALSE;
SecureZeroMemory(pszName, sizeof(pszName));
SecureZeroMemory(pszPwd, sizeof(pszPwd));
dwErr = CredUIPromptForCredentials(
&cui, // CREDUI_INFO structure
TEXT("TheServer"), // Target for credentials
// (usually a server)
NULL, // Reserved
0, // Reason
pszName, // User name
CREDUI_MAX_USERNAME_LENGTH+1, // Max number of char for user name
pszPwd, // Password
CREDUI_MAX_PASSWORD_LENGTH+1, // Max number of char for password
&fSave, // State of save check box
CREDUI_FLAGS_GENERIC_CREDENTIALS | // flags
CREDUI_FLAGS_ALWAYS_SHOW_UI |
CREDUI_FLAGS_DO_NOT_PERSIST);
if(!dwErr)
{
// Put code that uses the credentials here.
// When you have finished using the credentials,
// erase them from memory.
SecureZeroMemory(pszName, sizeof(pszName));
SecureZeroMemory(pszPwd, sizeof(pszPwd));
}
Связанные разделы