如何使用 C# 在 Windows 上存储和检索凭据
How to store and retrieve credentials on Windows using C#
我构建了一个 C# 程序,运行 在 Windows 10。我想通过按一个按钮从这个程序(计算结果)发送电子邮件。我将 from:
电子邮件地址和 subject:
等放在 C# 属性中,但我不想在程序的任何位置放置明文密码,并且我不希望用户每次发送邮件时都必须输入服务器密码。
可以吗?
如果是,如何(一般)?
我正在考虑将所有电子邮件信息(包括服务器的加密密码)放在一个数据文件中,以便在程序启动时读取。
或者 Windows 10 有一个设施...
您可以使用 Windows 凭据管理 API。这样您将只要求用户输入一次密码,然后将密码存储在 Windows 凭据管理器中。
下次您的应用程序启动并需要使用密码时,它将从 Windows 凭据管理器中读取。可以直接使用 Windows 凭据管理 API P/Invoke (credwrite, CredRead, example here) or via a C# wrapper 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;
}
}
}
我不建议将密码存储在客户端计算机上的文件中。即使您加密了密码,您也可能会将解密密钥嵌入到应用程序代码中,这不是一个好主意。
我构建了一个 C# 程序,运行 在 Windows 10。我想通过按一个按钮从这个程序(计算结果)发送电子邮件。我将 from:
电子邮件地址和 subject:
等放在 C# 属性中,但我不想在程序的任何位置放置明文密码,并且我不希望用户每次发送邮件时都必须输入服务器密码。
可以吗?
如果是,如何(一般)?
我正在考虑将所有电子邮件信息(包括服务器的加密密码)放在一个数据文件中,以便在程序启动时读取。
或者 Windows 10 有一个设施...
您可以使用 Windows 凭据管理 API。这样您将只要求用户输入一次密码,然后将密码存储在 Windows 凭据管理器中。
下次您的应用程序启动并需要使用密码时,它将从 Windows 凭据管理器中读取。可以直接使用 Windows 凭据管理 API P/Invoke (credwrite, CredRead, example here) or via a C# wrapper 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;
}
}
}
我不建议将密码存储在客户端计算机上的文件中。即使您加密了密码,您也可能会将解密密钥嵌入到应用程序代码中,这不是一个好主意。