如何在没有硬编码 NetworkCredentials 的情况下使用 System.Net.Mail?

Posted

技术标签:

【中文标题】如何在没有硬编码 NetworkCredentials 的情况下使用 System.Net.Mail?【英文标题】:How to use System.Net.Mail without hard-coding NetworkCredentials? 【发布时间】:2014-10-18 01:04:35 【问题描述】:

我正在开发一个程序,试图找出如何做到这一点。目前我正在使用 System.Net.Mail 发送 smtp 消息。我们的 smtp 服务器 (office 365) 需要身份验证才能发送外发邮件。我们的 office 365 通过单点登录和 AD 与我们的域配对,因此我们的凭据与 Microsoft Office 365 同步。如何使用 Kerberos 令牌发送邮件,而无需将 NetworkCredential basicCredential = new NetworkCredential(username, password) 明文输入文本?这甚至可能吗?

目前通过以下方式发送邮件

NetworkCredential basicCredential = new NetworkCredential("<<username>>", strPassword);

client.Credentials = basicCredential;
client.EnableSsl = true;
client.Send(message);

基本上我希望应用程序获取我的 Windows 用户名和密码并发送消息。

谢谢

【问题讨论】:

我对你卡在哪里感到困惑。您已经说过“当前正在发送电子邮件”,因为它已经有效了?什么不起作用,或者什么需要改变? 它将成为部门其他员工的工作应用程序,而不仅仅是我。因此,它需要能够查找各个用户的凭据。 所以您的目标是使用当前登录用户的凭据发送该程序要发送的电子邮件? 是的。而且我已经尝试过 DefaultCredentials 和 DefaultNetworkCredentials 在使用 DefaultCredentials 时,您还在尝试使用 client.Credentials 吗? 【参考方案1】:

我不知道你的技术背景,所以关于纯文本密码和 Kerberos 使用的评论退后一步......

在使用 SMTP 服务器进行身份验证时,根本不使用 Kerberos。 Kerberos 意味着客户端和服务器都与 Active Directory 控制器通信以进行身份​​验证。 Kerberos 不是 SMTP 规范的一部分,但 SMTP 服务器可以使用 Active Directory 进行验证,类似于 NTLM 的工作方式(服务器是唯一与 AD 对话的人)。

只要您使用 SSL 发送电子邮件,就应该没问题。只要传输是安全的,凭证是否是有效负载中的纯文本并不重要。如果您因为 TLS 连接到 Office365 时遇到问题(您收到 5.7.1 错误),您可以在 client.Send() 之前尝试此操作...

client.TargetName = "STARTTLS/smtp.office365.com";

如果您尝试使用当前登录用户的凭据,只要您不设置凭据,“UseDefaultCredentials = true”应该可以工作。您可以同时使用两者,但它们的使用顺序可能会重置另一个。

【讨论】:

我只在使用 UseDefaultCredentials = true 时收到 TLS 错误。如果我将我的用户名和密码作为字符串编程到程序中,它可以正常工作。

以上是关于如何在没有硬编码 NetworkCredentials 的情况下使用 System.Net.Mail?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有硬编码的情况下使用多个不和谐机器人帐户登录?

如何在没有硬编码 NetworkCredentials 的情况下使用 System.Net.Mail?

SKPSMTPMessage 中没有硬编码的“fromEmail”(发件人)

如何在 Swift 中硬编码 UIView 的大小属性

如何在不和谐的 client.users.get 函数中检索没有硬编码 ID 的用户

Xamarin.Forms:如何避免在 MVVM 绑定中硬编码字符串