повторно используемый диалог «сохранить учетные данные» (например, IE или Vista) в .NET или Win32 - PullRequest
2 голосов
/ 06 декабря 2009

В последнее время я работаю в офисе с беспроводной сетью, которая использует раздражающую схему аутентификации: каждые несколько часов вам нужно открывать браузер и вводить имя пользователя / пароль на веб-странице аутентификации, или вы теряете сеть доступ. (Когда время истечет, ваш следующий запрос браузера будет перенаправлен на страницу авторизации, и если ваши кредиты пройдут проверку, вы будете перенаправлены обратно на страницу, на которую пытались попасть изначально).

Этот вид раздражения может быть нормальным для беспроводной сети аэропорта или кафе, но в офисе это приводит в бешенство, особенно если вы работаете с сетевыми услугами (например, SVN, электронная почта), которые внезапно перестают работать каждые несколько часов, если вы не вызвать браузер

Итак, я написал крошечное консольное приложение C #, которое будет входить в систему, отправляя HTTP-запрос в форму входа с моими учетными данными.

Это явно небезопасно - мой пароль находится внутри моего исходного кода для всеобщего обозрения. Я предпочел бы иметь возможность сохранять свои учетные данные, используя тот же механизм, который IE, например, использует для сохранения и повторного заполнения паролей в веб-формах.

В идеале я хотел бы использовать повторно используемый компонент для ввода, сохранения и извлечения учетных данных (включая пользовательский интерфейс с необязательным флажком «сохранить кредиты»), чтобы мое приложение могло просто делать что-то вроде этого (в псевдокоде):

// retrieve any saved credentials from some secure place
Credentials creds = GetCreds(some parameters go here);

// if none stored, then show the user an "enter and optionally save credentials" dialog
if (creds == null)
    creds = GetCredsDialog(some parameters go here);

// POST to the authentication page
if (creds != null)
{
    string authUrl = "https://somehost/login/";
    string postDataPattern = "post data pattern here";

    // use SecureString here instead?
    string postData = string.Format (postDataPattern, HttpUtility.HtmlEncode(creds.Username), HttpUtility.HtmlEncode(creds.Password));
    WebClient wc = new WebClient();
    string html = wc.UploadString (authUrl, "POST", postData);

    // TODO: if html indicates login failure, clear stored credentials 
    // and ask for new creds. then retry.
}

По сути, я хочу переложить бремя безопасного хранения кредитов с моего приложения на Windows, при условии, что парни из Windows будут лучше в этом, чем я. : -)

Я не ищу здесь железную защиту, просто нечто, сравнимое с тем, что IE использует для защиты моих других сохраненных паролей для других веб-сайтов. Я просто не хочу хранить пароли в виде простого текста в моем коде!

Конечно, правильное решение здесь - это работать с ИТ-отделом, чтобы заставить их получить реальную схему аутентификации для беспроводной связи, но пока я один.

Было бы предпочтительнее решение .NET, но решение Win32 тоже было бы в порядке - я мог бы без проблем портировать приложение на C ++.

1 Ответ

5 голосов
/ 06 декабря 2009

Для хранения учетных данных используйте класс ProtectedData в System.Security.dll.
Передав DataProtectionScope.CurrentUser, другой пользователь не сможет расшифровать данные.

РЕДАКТИРОВАТЬ : Для этого диалогового окна вы можете использовать CredUIPromptForCredentials API-функцию

См. здесь для обёртки .Net.

...