В последнее время я работаю в офисе с беспроводной сетью, которая использует раздражающую схему аутентификации: каждые несколько часов вам нужно открывать браузер и вводить имя пользователя / пароль на веб-странице аутентификации, или вы теряете сеть доступ. (Когда время истечет, ваш следующий запрос браузера будет перенаправлен на страницу авторизации, и если ваши кредиты пройдут проверку, вы будете перенаправлены обратно на страницу, на которую пытались попасть изначально).
Этот вид раздражения может быть нормальным для беспроводной сети аэропорта или кафе, но в офисе это приводит в бешенство, особенно если вы работаете с сетевыми услугами (например, 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 ++.