사용자에게 자격 증명 요청

애플리케이션은 관리자 암호를 저장하지 않거나 토큰에 적절한 권한이 있는지 확인하기 위해 사용자에게 사용자 이름 및 암호 정보를 묻는 메시지를 표시해야 할 수 있습니다.

그러나 단순히 자격 증명을 묻는 메시지를 표시하면 사용자가 화면에 표시되는 임의의 확인되지 않은 대화 상자에 이를 제공하도록 학습시킬 수 있습니다. 학습 효과를 줄이려면 다음 절차를 수행하는 것이 좋습니다.

사용자 자격 증명을 올바르게 획득하려면

  1. 애플리케이션의 일부분인 메시지를 사용하여 사용자에게 사용자 이름과 암호를 요청하는 대화 상자가 표시됨을 알릴 수 있습니다. CredUIPromptForCredentials 호출 시 CREDUI_INFO 구조를 사용하여 식별 데이터 또는 메시지를 전달할 수도 있습니다.
  2. CredUIPromptForCredentials를 호출합니다. 사용자 이름 및 암호 정보에 지정된 최대 문자 수에는 종료 null 문자가 포함됩니다.
  3. CredUIParseUserNameCredUIConfirmCredentials를 호출하여 적절한 자격 증명을 얻었는지 확인합니다.

다음 예제에서는 CredUIPromptForCredentials 를 호출하여 사용자에게 사용자 이름과 암호를 요청하는 방법을 보여 줍니다. 먼저 CREDUI_INFO 구조체에 사용할 프롬프트에 대한 정보를 입력합니다. 다음으로 코드는 두 개의 버퍼를 0으로 채웁니다. 이 작업은 사용자에게 이전 사용자 이름 또는 암호를 표시할 수 있는 정보가 함수에 전달되지 않도록 하기 위해 수행됩니다. CredUIPromptForCredentials를 호출하면 대화 상자가 나타납니다. 보안상의 이유로 이 예제에서는 CREDUI_FLAGS_DO_NOT_PERSIST 플래그를 사용하여 운영 체제가 암호가 노출될 수 있으므로 저장하지 못하도록 합니다. 오류가 없으면 CredUIPromptForCredentials 는 pszName 및 pszPwd 변수를 채우고 0을 반환합니다. 애플리케이션이 자격 증명 사용을 완료하면 정보가 실수로 표시되지 않도록 버퍼에 0을 배치해야 합니다.

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