ユーザーに資格情報の要求
アプリケーションでは、管理者パスワードの保存を避けるために、またはトークンが適切な特権を保持していることを確認するために、ユーザーにユーザー名とパスワード情報の入力を求める必要がある場合があります。
ただし、資格情報の入力を求めるだけで、ユーザーが画面に表示されるランダムで識別できないダイアログ ボックスに入力するようにトレーニングされる場合があります。 そのトレーニング効果を減らすには、次の手順を実行することをお勧めします。
ユーザーの資格情報を適切に取得するには
- アプリケーションの一部であるメッセージを使用して、ユーザーにユーザー名とパスワードを要求するダイアログ ボックスが表示されることをユーザーに通知します。 CredUIPromptForCredentials の呼び出しでCREDUI_INFO構造を使用して、識別データまたはメッセージを伝達することもできます。
- CredUIPromptForCredentials を呼び出します。 ユーザー名とパスワード情報に指定された最大文字数には、終端の null 文字が含まれていることに注意してください。
- CredUIParseUserName と CredUIConfirmCredentials を呼び出して、適切な資格情報を取得したことを確認します。
次の例は、 CredUIPromptForCredentials を呼び出して、ユーザーにユーザー名とパスワードを要求する方法を示しています。 まず、CREDUI_INFO構造体に、使用するプロンプトに関する情報を入力します。 次に、2 つのバッファーにゼロが設定されます。 これは、古いユーザー名またはパスワードをユーザーに表示する可能性がある情報が関数に渡されないようにするために行われます。 CredUIPromptForCredentials を呼び出すと、ダイアログ ボックスが表示されます。 セキュリティ上の理由から、この例では CREDUI_FLAGS_DO_NOT_PERSIST フラグを使用して、オペレーティング システムがパスワードを保存できないようにします。これは、それが公開される可能性があるためです。 エラーがない場合、 CredUIPromptForCredentials は pszName 変数と pszPwd 変数を入力し、ゼロを返します。 アプリケーションで資格情報の使用が完了したら、情報が誤って表示されないように、バッファーにゼロを配置する必要があります。
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));
}
関連トピック