Как хранить и получать учетные данные в Windows с помощью С#

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

Можно ли это сделать?

Если да, то как (обычно)?

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

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

Ответ 1

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

В следующий раз, когда ваше приложение запустится и ему нужно будет использовать пароль, оно будет считывать его из диспетчера учетных данных Windows. Можно использовать API управления учетными данными Windows напрямую, используя pinvoke (credwrite, CredRead, пример здесь) или через обертку С# 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;
        }
    }
}

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

Ответ 2

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

https://github.com/Bhaal22/vaultmanager

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