要求使用者輸入認證
您的應用程式可能需要提示使用者輸入使用者名稱和密碼資訊,以避免儲存系統管理員密碼,或確認令牌持有適當的許可權。
不過,只要提示輸入認證,即可訓練使用者將這些認證提供給畫面上出現的任何隨機、不明對話框。 建議使用下列步驟來減少該訓練效果。
若要正確取得使用者認證
- 使用清楚顯示屬於您應用程式的訊息通知使用者,他們將看到要求輸入使用者名稱和密碼的對話框。 您也可以在呼叫 CredUIPromptForCredentials 上使用 CREDUI_INFO 結構來傳達識別數據或訊息。
- 呼叫 CredUIPromptForCredentials。 請注意,為使用者名稱和密碼資訊指定的字元數上限包含終止的 Null 字元。
- 呼叫 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));
}
相關主題