Solicitando credenciais ao usuário
Seu aplicativo pode precisar solicitar ao usuário informações de nome de usuário e senha para evitar armazenar uma senha de administrador ou verificar se o token contém os privilégios apropriados.
No entanto, simplesmente solicitar credenciais pode treinar os usuários a fornecer para qualquer caixa de diálogo aleatória e não identificada que apareça na tela. O procedimento a seguir é recomendado para reduzir esse efeito de treinamento.
Para adquirir corretamente as credenciais do usuário
- Informe o usuário, usando uma mensagem claramente parte do seu aplicativo, que ele verá uma caixa de diálogo que solicita seu nome de usuário e senha. Você também pode usar a estrutura CREDUI_INFO na chamada para CredUIPromptForCredentials para transmitir dados de identificação ou uma mensagem.
- Chame CredUIPromptForCredentials. Observe que o número máximo de caracteres especificado para informações de nome de usuário e senha inclui o caractere nulo de terminação.
- Chame CredUIParseUserName e CredUIConfirmCredentials para verificar se você obteve as credenciais apropriadas.
O exemplo a seguir mostra como chamar CredUIPromptForCredentials para solicitar ao usuário um nome de usuário e uma senha. Ele começa preenchendo uma estrutura CREDUI_INFO com informações sobre quais prompts usar. Em seguida, o código preenche dois buffers com zeros. Isso é feito para garantir que nenhuma informação seja passada para a função que possa revelar um nome de usuário ou senha antigo para o usuário. A chamada para CredUIPromptForCredentials abre a caixa de diálogo. Por motivos de segurança, este exemplo usa o sinalizador CREDUI_FLAGS_DO_NOT_PERSIST para impedir que o sistema operacional armazene a senha porque ela pode ser exposta. Se não houver erros, CredUIPromptForCredentials preencherá as variáveis pszName e pszPwd e retornará zero. Quando o aplicativo terminar de usar as credenciais, ele deverá colocar zeros nos buffers para impedir que as informações sejam reveladas acidentalmente.
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));
}
Tópicos relacionados