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
- 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.
- 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.
- 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));
}
Temas relacionados