Meminta Kredensial kepada Pengguna

Aplikasi Anda mungkin perlu meminta informasi nama pengguna dan kata sandi kepada pengguna untuk menghindari penyimpanan kata sandi administrator atau untuk memverifikasi bahwa token memiliki hak istimewa yang sesuai.

Namun, hanya meminta kredensial dapat melatih pengguna untuk menyediakannya ke kotak dialog acak dan tidak dikenal yang muncul di layar. Prosedur berikut disarankan untuk mengurangi efek pelatihan tersebut.

Untuk memperoleh kredensial pengguna dengan benar

  1. Beri tahu pengguna, dengan menggunakan pesan yang jelas merupakan bagian dari aplikasi Anda, bahwa mereka akan melihat kotak dialog yang meminta nama pengguna dan kata sandi mereka. Anda juga dapat menggunakan struktur CREDUI_INFO pada panggilan ke CredUIPromptForCredentials untuk menyampaikan mengidentifikasi data atau pesan.
  2. Panggil CredUIPromptForCredentials. Perhatikan bahwa jumlah maksimum karakter yang ditentukan untuk informasi nama pengguna dan kata sandi menyertakan karakter null yang mengakhiri.
  3. Panggil CredUIParseUserName dan CredUIConfirmCredentials untuk memverifikasi bahwa Anda mendapatkan kredensial yang sesuai.

Contoh berikut menunjukkan cara memanggil CredUIPromptForCredentials untuk meminta nama pengguna dan kata sandi kepada pengguna. Ini dimulai dengan mengisi struktur CREDUI_INFO dengan informasi tentang perintah apa yang akan digunakan. Selanjutnya, kode mengisi dua buffer dengan nol. Ini dilakukan untuk memastikan bahwa tidak ada informasi yang diteruskan ke fungsi yang mungkin mengungkapkan nama pengguna atau kata sandi lama kepada pengguna. Panggilan ke CredUIPromptForCredentials memunculkan kotak dialog. Untuk alasan keamanan, contoh ini menggunakan bendera CREDUI_FLAGS_DO_NOT_PERSIST untuk mencegah sistem operasi menyimpan kata sandi karena kemudian mungkin terekspos. Jika tidak ada kesalahan, CredUIPromptForCredentials mengisi variabel pszName dan pszPwd dan mengembalikan nol. Ketika aplikasi telah selesai menggunakan kredensial, aplikasi harus menempatkan nol di buffer untuk mencegah informasi terungkap secara tidak sengaja.

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));
}

CredUICmdLinePromptForCredentials

CREDUI_UINFO