Как хранить и получать учетные данные на окнах, используя C#

Я строю C# программу, которая будет работать на Win10. Я хочу отправлять электронные письма из этой программы (результаты расчетов), просто нажав кнопку. Я указал адрес электронной почты и тему: и т. Д. В свойствах C#, но я не хочу вводить открытый текст в любом месте программы, И я не хочу, чтобы пользователь вводил пароль для сервера каждый раз, когда отправляется почта.

Это может быть сделано?

Если да, то как (вообще)?

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

Или, может быть, Win10 имеет средства для этого...

2 ответа

Решение

Вы можете использовать API управления учетными данными Windows. Таким образом, вы попросите пользователя ввести пароль только один раз, а затем сохраните пароль в диспетчере учетных данных Windows.

В следующий раз, когда ваше приложение запустится и ему нужно будет использовать пароль, оно будет считывать его из диспетчера учетных данных Windows. Можно использовать API управления учетными данными Windows напрямую, используя pinvoke ( credwrite, CredRead, пример здесь) или через обертку C# CredentialManagement.


Пример использования с помощью пакета Nuget CredentialManagement:

public class PasswordRepository
{
    private const string PasswordName = "ServerPassword";

    public void SavePassword(string password)
    {
        using (var cred = new Credential())
        {
            cred.Password = password;
            cred.Target = PasswordName;
            cred.Type = CredentialType.Generic;
            cred.PersistanceType = PersistanceType.LocalComputer;
            cred.Save();
        }
    }

    public string GetPassword()
    {
        using (var cred = new Credential())
        {
            cred.Target = PasswordName;
            cred.Load();
            return cred.Password;
        }
    }
}

Я не рекомендую хранить пароли в файлах на клиентских компьютерах, даже если вы зашифруете пароль, вы, вероятно, вставите ключ дешифрования в код приложения, что не очень хорошая идея.

Только что выпустил небольшую библиотеку, совместимую с.net 45 и.net 4.6

https://github.com/Bhaal22/vaultmanager

Любые отзывы приветствуются.

Другие вопросы по тегам