Pytaj użytkownika o poświadczenia
Aplikacja może wymagać monitowania użytkownika o podanie nazwy użytkownika i informacji o haśle, aby uniknąć przechowywania hasła administratora lub sprawdzić, czy token posiada odpowiednie uprawnienia.
Jednak po prostu monitowanie o poświadczenia może wytrenować użytkowników, aby dostarczyć je do dowolnego losowego, niezidentyfikowanego okna dialogowego wyświetlanego na ekranie. Poniższa procedura jest zalecana, aby zmniejszyć ten efekt treningowy.
Aby prawidłowo uzyskać poświadczenia użytkownika
- Poinformuj użytkownika, używając komunikatu, który jest wyraźnie częścią aplikacji, że zobaczy okno dialogowe, które zażąda nazwy użytkownika i hasła. Możesz również użyć struktury CREDUI_INFO wywołania, aby CredUIPromptForCredentials przekazać dane identyfikujące lub komunikat.
- Wywołaj CredUIPromptForCredentials. Należy pamiętać, że maksymalna liczba znaków określonych dla nazwy użytkownika i informacji o haśle zawiera znak null zakończenia.
- Wywołaj CredUIParseUserName i CredUIConfirmCredentials, aby sprawdzić, czy uzyskano odpowiednie poświadczenia.
W poniższym przykładzie pokazano, jak wywołać metodę CredUIPromptForCredentials, aby poprosić użytkownika o podanie nazwy użytkownika i hasła. Proces zaczyna się od wypełnienia struktury CREDUI_INFO informacjami o tym, jakie monity mają być używane. Następnie kod wypełnia dwa bufory zerami. Należy to zrobić, aby upewnić się, że żadne informacje nie są przekazywane do funkcji, która może ujawnić starą nazwę użytkownika lub hasło użytkownikowi. Wywołanie CredUIPromptForCredentials powoduje wyświetlenie okna dialogowego. Ze względów bezpieczeństwa w tym przykładzie użyto flagi CREDUI_FLAGS_DO_NOT_PERSIST, aby uniemożliwić systemowi operacyjnemu przechowywanie hasła, ponieważ może zostać ujawnione. Jeśli nie ma żadnych błędów, CredUIPromptForCredentials wypełnia zmienne pszName i pszPwd i zwraca zero. Po zakończeniu korzystania z poświadczeń aplikacja powinna umieścić zera w buforach, aby zapobiec przypadkowemu ujawnieniu informacji.
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));
}
Tematy pokrewne