многоразовое диалоговое окно «сохранения учетных данных» (например, в IE или Vista) в .NET или Win32

StackOverflow https://stackoverflow.com/questions/1853864

Вопрос

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

Такое раздражение может быть нормальным для беспроводной связи в аэропорту или кафе, но в офисе оно приводит в бешенство, особенно если вы работаете с сетевыми службами (например,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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top