Demander des informations d’identification à l’utilisateur

Votre application peut avoir besoin d’inviter l’utilisateur à fournir des informations de nom d’utilisateur et de mot de passe pour éviter de stocker un mot de passe administrateur ou pour vérifier que le jeton contient les privilèges appropriés.

Toutefois, le simple fait d’inviter des informations d’identification peut entraîner les utilisateurs à les fournir à n’importe quelle boîte de dialogue aléatoire et non identifiée qui s’affiche à l’écran. La procédure suivante est recommandée pour réduire cet effet d’entraînement.

Pour acquérir correctement les informations d’identification de l’utilisateur

  1. Informez l’utilisateur, à l’aide d’un message qui fait clairement partie de votre application, qu’il verra une boîte de dialogue qui demande son nom d’utilisateur et son mot de passe. Vous pouvez également utiliser la structure CREDUI_INFO sur l’appel à CredUIPromptForCredentials pour transmettre des données d’identification ou un message.
  2. Appelez CredUIPromptForCredentials. Notez que le nombre maximal de caractères spécifié pour les informations de nom d’utilisateur et de mot de passe inclut le caractère null de fin.
  3. Appelez CredUIParseUserName et CredUIConfirmCredentials pour vérifier que vous avez obtenu les informations d’identification appropriées.

L’exemple suivant montre comment appeler CredUIPromptForCredentials pour demander à l’utilisateur un nom d’utilisateur et un mot de passe. Il commence par remplir une structure de CREDUI_INFO avec des informations sur ce qui invite à utiliser. Ensuite, le code remplit deux mémoires tampons avec des zéros. Cela permet de garantir qu’aucune information n’est transmise à la fonction susceptible de révéler un ancien nom d’utilisateur ou un mot de passe à l’utilisateur. L’appel à CredUIPromptForCredentials affiche la boîte de dialogue. Pour des raisons de sécurité, cet exemple utilise l’indicateur CREDUI_FLAGS_DO_NOT_PERSIST pour empêcher le système d’exploitation de stocker le mot de passe, car il peut alors être exposé. S’il n’y a aucune erreur, CredUIPromptForCredentials remplit les variables pszName et pszPwd et retourne zéro. Lorsque l’application a terminé d’utiliser les informations d’identification, elle doit placer des zéros dans les mémoires tampons pour empêcher que les informations ne soient révélées accidentellement.

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