如何使用 C# 在 Windows 上存储和检索凭据

2024-04-15

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

可以吗?

如果是这样,(通常)如何?

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

或者 Windows 10 可能有这样的功能......


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

下次您的应用程序启动并且需要使用密码时,它将从 Windows 凭据管理器中读取该密码。可以直接使用 Windows Credential Management APIP/Invoke http://en.wikipedia.org/wiki/Platform_Invocation_Services (信用写入 http://www.pinvoke.net/default.aspx/advapi32.credwrite, CredRead http://www.pinvoke.net/default.aspx/advapi32/CredRead%20.html, 例子在这里 https://stackoverflow.com/questions/22435561/encrypting-credentials-in-a-wpf-application) 或通过 C# 包装器凭证管理 https://www.nuget.org/packages/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;
        }
    }
}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 C# 在 Windows 上存储和检索凭据 的相关文章

随机推荐

  • Google 云存储 - 权限不足

    这个问题似乎与另一篇文章相似 但对我来说不同 因为我检查了testIamPermission 回报显示我获得了所需的所有许可并且仍然收到权限不足 这是我收到的 storage buckets get true storage buckets
  • 从抽象父类调用通用类型列表上的方法

    这是我当前的类型层次结构 我正在尝试实现一种方法PlaneRegion这将调用一个名为的方法Shift 在其派生类的列表上 其中该列表在所有列表中都称为 PlaneBoundaries 但它们具有不同的类型 like so public a
  • 如何在 Tensorflow 2.0 中使用嵌入投影仪

    随着 tf contrib 模块从 Tensorflow 中消失 并且 tf train Saver 也消失 我无法找到一种方法来存储一组嵌入及其相应的缩略图 以便 Tensorboard Projector 可以读取它们 The 张量板文
  • 与编程语言/API 相关的常用“语义”的简单定义?

    今天我突然想到 虽然我在提到语言元素和命名约定时已经采用并且不经常使用 语义 一词 但我对正式定义没有任何感觉 我试图在编程领域找到一个正式的定义 http en wikipedia org wiki Formal semantics of
  • 为什么鼠标滚轮事件的目标属性与其他(click、mousedown、touchstart)事件的目标属性不同?

    鼠标滚轮事件target属性提供在操作鼠标滚轮 或支持手势的触摸板 时鼠标当前悬停在其上的 DOM 元素 当我这样做时 至少在 Safari 6 中 我稍后会测试其他浏览器 我将得到文本节点本身target 即使我直接在文本上执行操作 其他
  • 首先是 DDD 数据库。如何处理聚合

    我正在尝试学习 DDD 的概念 我做了一个项目 我使用数据库优先方法 在基础设施中 我添加了一个 edmx 文件 我选择自动生成实体 现在在 域 中我正在尝试创建聚合 但在这里我遇到了一些问题 我正在尝试创建一个名为 User 的聚合 但
  • 如何为这个业务逻辑代码编写可靠的单元测试?

    我有一些想要测试的业务逻辑代码 目前我只知道如何对没有其他依赖项的逻辑代码编写单元测试 有人能给我指出如何测试这个函数的好方向吗 也许可以举个例子 测试这个的唯一方法是集成测试还是我必须使用模拟 存根
  • 安装旧版本的 gcc [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想在我的 Ubuntu 64 位系统上安装 gcc 4 1 2 该系统当前有 gcc 4 4 我想继续使用当前的 gcc 但也想添加 gcc 4 1
  • Swagger - 时间戳奇怪的表示

    我有 Spring Boot 控制器 为了方便 API 参考 我使用了 Swagger 关于问题timestamp 为什么在生成的文档示例中看起来像 timestamp date 0 day 0 hours 0 minutes 0 mont
  • UWP 网格填充父窗口

    我们正在进行一个学校项目 但陷入了死胡同 我们正在努力使grid填充整个父窗口 但我们根本无法这样做 This is what the designer shows and how we want it to look And this i
  • 如何从 Twitter Bootstrap 和 Bloodhound 建议中获取 id 和 value?

    选择建议时如何从 typeahead js 获取 id 和 value 我有一个 json 如下 id 1 name paul id 2 name jim id 3 name tom id 4 name medor id 5 name ja
  • Maven jdepend 循环构建失败

    当包循环存在时 有没有办法使用 maven 中的 jdepend 插件来使构建失败 我知道你可以用 ant 很容易地做到这一点 但我还没有弄清楚如何用 Maven 做到这一点 谢谢 杰夫 根据已接受的答案 我改进了性能和日志输出 并将其发布
  • 为什么 CompareTo 这么短地实现?

    考虑以下代码 namespace ConsoleApplication1 class Program static void Main string args Console WriteLine 100 CompareTo 200 prin
  • 如何获取启动进程的命令行

    从 Java 中 是否可以获得包含启动应用程序的所有参数的完整命令行 System getEnv and System getProperties 似乎不包含这些值 其中一些可以从 RuntimeMXBean 获得 通过调用获得Manage
  • Jenkins 管道到 Excel 电子表格

    我有一个每天运行 sql 计数的管道 作为回归测试的一部分 我希望能够将每个构建的结果导出到一个 excel 文档中 在其中可以存储和比较结果 这可能吗 提前致谢 None
  • 解析 JSX 文件以提取 Import 语句的属性

    有一个 jsx 文件 其中包含内容
  • 使用 T-SQL 通过游标导航存储过程的结果

    由于遗留的报告生成系统 我需要使用游标来遍历存储过程的结果集 系统通过打印结果集中每一行的数据来生成报告输出 重构报告系统远远超出了这个问题的范围 据我所知 DECLARE CURSOR 语法要求其源是 SELECT 子句 但是 我需要使用
  • 当前缓冲区的议程视图

    编辑 解决方案很简单 但对于任何可以解释为什么我的方法不起作用的人来说都是 加分 原点 我想要一个 org mode custom command 来显示仅从当前缓冲区创建的议程 以下代码片段显示了我想要的视图类型 setq org age
  • 在 mysql 中使用 TCP/IP 上的 Unix 套接字有什么合法的理由吗?

    我试图弄清楚为什么 mysql 默认使用 Unix 套接字 tmp mysql sock 而不是普通的 TCP IP 套接字 这看起来不像是一个安全问题 因为你只能在 127 0 0 1 上监听 这应该同样安全 套接字文件是世界上可写的 所
  • 如何使用 C# 在 Windows 上存储和检索凭据

    我构建了一个要在 Windows 10 上运行的 C 程序 我想只需按一个按钮即可从该程序发送电子邮件 计算结果 我把from 电子邮件地址和subject 等 但我不想在程序中的任何地方放置明文密码 并且我不希望用户每次发送邮件时都必须输