Compartilhar via


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

  1. 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.
  2. 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.
  3. 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));
}

CredUICmdLinePromptForCredentials

CREDUI_UINFO