Compartir a través de


Preguntar al usuario por las credenciales

Es posible que la aplicación tenga que solicitar al usuario información de nombre de usuario y contraseña para evitar almacenar una contraseña de administrador o para comprobar que el token contiene los privilegios adecuados.

Sin embargo, simplemente solicitar credenciales puede entrenar a los usuarios para proporcionarlos a cualquier cuadro de diálogo aleatorio y no identificado que aparezca en la pantalla. Se recomienda el procedimiento siguiente para reducir ese efecto de entrenamiento.

Para adquirir correctamente las credenciales de usuario

  1. Informe al usuario, mediante un mensaje que forma parte claramente de la aplicación, de que verá un cuadro de diálogo que solicita su nombre de usuario y contraseña. También puede usar la estructura de CREDUI_INFO en la llamada a CredUIPromptForCredentials para transmitir datos de identificación o un mensaje.
  2. Llame a CredUIPromptForCredentials. Tenga en cuenta que el número máximo de caracteres especificados para la información de nombre de usuario y contraseña incluye el carácter nulo de terminación.
  3. Llame a CredUIParseUserName y CredUIConfirmCredentials para comprobar que obtuvo las credenciales adecuadas.

En el ejemplo siguiente se muestra cómo llamar a CredUIPromptForCredentials para pedir al usuario un nombre de usuario y una contraseña. Comienza rellenando una estructura de CREDUI_INFO con información sobre las indicaciones que se deben usar. A continuación, el código rellena dos búferes con ceros. Esto se hace para asegurarse de que no se pasa información a la función que podría revelar un nombre de usuario o una contraseña antiguos al usuario. La llamada a CredUIPromptForCredentials abre el cuadro de diálogo. Por motivos de seguridad, en este ejemplo se usa la marca CREDUI_FLAGS_DO_NOT_PERSIST para evitar que el sistema operativo almacene la contraseña porque puede exponerse. Si no hay errores, CredUIPromptForCredentials rellena las variables pszName y pszPwd y devuelve cero. Cuando la aplicación haya terminado de usar las credenciales, debe colocar ceros en los búferes para evitar que la información se muestre accidentalmente.

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