C # WinForm - сохранить пароль локально в диспетчере учетных данных (как Keychain делает для iOS) - PullRequest
2 голосов
/ 12 апреля 2011

Я хотел бы создать приложение C # WinForms, которое будет создавать веб-запросы к серверам, требующим ввода имени пользователя и пароля (обычная проверка подлинности).

Я хочу сохранить пароль локально (конечно, зашифровано) на машине, на которой запущено приложение.

По сути, мне нужно что-то, что работает как Keychain в iOS или «безопасное хранилище» в Eclipse, только для .NET

Я нашел диспетчер учетных данных в Windows, но все примеры API взяты из .NET Framework V2.0

Разве нет нормального API от Microsoft о том, как использовать его в C #?

Ответы [ 2 ]

1 голос
/ 17 июня 2011

Приложения Windows могут использовать для этого DPAPI , API защиты данных, который хранит секреты на компьютере, зашифрованные (косвенно) с учетными данными пользователя.Любой процесс, который выполняется с правами пользователя, может получить доступ к этим данным.При желании вы можете позволить пользователю добавить свой собственный пароль (для этого одного элемента / секрета), если хотите (PrompStruct)DPAPI также доступен через C # (в сети есть примеры).

0 голосов
/ 17 июня 2011

Вы можете сохранить учетные данные в разделе в app.config и затем зашифровать раздел (аналогично тому, что вы будете делать в web.config для веб-приложения).

Вы можете использовать SectionInformation.ProtectSectionдля защиты раздела и SectionInformation.GetRawXml для извлечения зашифрованной информации (расшифровка выполняется прозрачно).

Пример (взят из статьи MSDN ниже):

static public void ProtectSection()
{

    // Get the current configuration file.
    System.Configuration.Configuration config =
            ConfigurationManager.OpenExeConfiguration(
            ConfigurationUserLevel.None);


    // Get the section.
    UrlsSection section =
        (UrlsSection)config.GetSection("MyUrls");


    // Protect (encrypt)the section.
    section.SectionInformation.ProtectSection(
        "RsaProtectedConfigurationProvider");

    // Save the encrypted section.
    section.SectionInformation.ForceSave = true;

    config.Save(ConfigurationSaveMode.Full);

    // Display decrypted configuration 
    // section. Note, the system
    // uses the Rsa provider to decrypt
    // the section transparently.
    string sectionXml =
        section.SectionInformation.GetRawXml();

    Console.WriteLine("Decrypted section:");
    Console.WriteLine(sectionXml);

}

http://msdn.microsoft.com/en-us/library/system.configuration.sectioninformation.protectsection.aspx

...