многоразовое диалоговое окно «сохранения учетных данных» (например, в IE или Vista) в .NET или Win32
-
13-09-2019 - |
Вопрос
В последнее время я работаю в офисе с беспроводной сетью, в которой используется раздражающая схема аутентификации:каждые несколько часов вам нужно открывать браузер и вводить имя пользователя и пароль на веб-странице аутентификации, иначе вы потеряете доступ к сети.(По истечении времени ваш следующий запрос браузера будет перенаправлен на страницу аутентификации, и если ваши кредиты пройдут проверку, вы будете перенаправлены обратно на страницу, на которую вы пытались попасть изначально).
Такое раздражение может быть нормальным для беспроводной связи в аэропорту или кафе, но в офисе оно приводит в бешенство, особенно если вы работаете с сетевыми службами (например,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++.
Решение
Для хранения учетных данных используйте Защищенные данные класс в System.Security.dll.
Проходя мимо DataProtectionScope.CurrentUser
, ни один другой пользователь не сможет расшифровать данные.
РЕДАКТИРОВАТЬ:Для диалога вы можете использовать Кредуипромптфоркредентиалс API-функция
Видеть здесь для оболочки .Net.