Richiesta di credenziali all'utente

L'applicazione potrebbe dover richiedere all'utente le informazioni sul nome utente e sulla password per evitare di archiviare una password di amministratore o per verificare che il token contenga i privilegi appropriati.

Tuttavia, la semplice richiesta di credenziali può eseguire il training degli utenti per fornire gli utenti a qualsiasi finestra di dialogo casuale non identificata visualizzata sullo schermo. La procedura seguente è consigliata per ridurre l'effetto di training.

Per acquisire correttamente le credenziali utente

  1. Informare l'utente, usando un messaggio che fa chiaramente parte dell'applicazione, che visualizzerà una finestra di dialogo che richiede il nome utente e la password. È anche possibile usare la struttura CREDUI_INFO nella chiamata a CredUIPromptForCredentials per trasmettere i dati di identificazione o un messaggio.
  2. Chiamare CredUIPromptForCredentials. Si noti che il numero massimo di caratteri specificato per le informazioni su nome utente e password include il carattere null di terminazione.
  3. Chiamare CredUIParseUserName e CredUIConfirmCredentials per verificare di aver ottenuto le credenziali appropriate.

Nell'esempio seguente viene illustrato come chiamare CredUIPromptForCredentials per chiedere all'utente un nome utente e una password. Inizia compilando una struttura CREDUI_INFO con informazioni sulle richieste da usare. Il codice riempie quindi due buffer con zeri. Questa operazione viene eseguita per garantire che nessuna informazione venga passata alla funzione che potrebbe rivelare un nome utente o una password precedente all'utente. La chiamata a CredUIPromptForCredentials visualizza la finestra di dialogo. Per motivi di sicurezza, in questo esempio viene usato il flag CREDUI_FLAGS_DO_NOT_PERSIST per impedire al sistema operativo di archiviare la password perché potrebbe quindi essere esposta. Se non sono presenti errori, CredUIPromptForCredentials compila le variabili pszName e pszPwd e restituisce zero. Al termine dell'uso delle credenziali, l'applicazione deve inserire zeri nei buffer per evitare che le informazioni vengano accidentalmente rivelate.

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