【问题标题】:How to store and retrieve credentials on Windows using C#如何使用 C# 在 Windows 上存储和检索凭据
【发布时间】:2015-12-09 12:07:29
【问题描述】:

我构建了一个要在 Windows 10 上运行的 C# 程序。我想通过按一个按钮从该程序发送电子邮件(计算结果)。我将from: 电子邮件地址和subject: 等放在C# 属性中,但我不想在程序中的任何地方放置明文密码,并且我不希望用户必须键入每次发送邮件时服务器的密码。

可以吗?

如果是这样,如何(一般)?

我正在考虑将所有电子邮件信息(包括服务器的加密密码)放入数据文件中,以便在程序启动期间读取。

或者,也许 Windows 10 有这样的功能......

【问题讨论】:

标签: c# credentials credential-manager


【解决方案1】:

您可以使用 Windows 凭据管理 API。这样,您只需向用户询问一次密码,然后将密码存储在 Windows 凭据管理器中。

下次您的应用程序启动并需要使用密码时,它将从 Windows 凭据管理器中读取该密码。可以直接使用P/InvokecredwriteCredReadexample here)或通过 C# 包装器CredentialManagement 使用 Windows 凭据管理 API。


使用 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;
        }
    }
}

我不建议将密码存储在客户端计算机上的文件中。即使您加密了密码,您也可能会将解密密钥嵌入到应用程序代码中,这不是一个好主意。

【讨论】:

    猜你喜欢
    • 2013-07-18
    • 2012-03-02
    • 2014-09-06
    • 2016-06-15
    • 2018-09-11
    • 1970-01-01
    • 2016-12-19
    • 2011-01-17
    • 1970-01-01
    相关资源
    最近更新 更多