要求使用者輸入認證

您的應用程式可能需要提示使用者輸入使用者名稱和密碼資訊,以避免儲存系統管理員密碼,或確認權杖是否具有適當的許可權。

不過,只要提示輸入認證,即可訓練使用者將這些認證提供給畫面上出現的任何隨機、未識別對話方塊。 建議使用下列程式來減少該定型效果。

正確取得使用者認證

  1. 使用清楚屬於您應用程式的訊息通知使用者,他們會看到要求其使用者名稱和密碼的對話方塊。 您也可以在呼叫 CredUIPromptForCredentials時使用CREDUI_INFO結構來傳達識別資料或訊息。
  2. 呼叫 CredUIPromptForCredentials。 請注意,為使用者名稱和密碼資訊指定的字元數目上限包括終止的 Null 字元。
  3. 呼叫 CredUIParseUserNameCredUIConfirmCredentials 以確認您已取得適當的認證。

下列範例示範如何呼叫 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));
}

CredUICmdLinePromptForCredentials

CREDUI_UINFO