在 TLS 加密下使用 DefaultNetworkCredential?

Use DefaultNetworkCredential under TLS encryption?

我们公司正在将SMTP邮件服务器切换到Office 365,关键问题是新的SMTP服务器"smtp.office365.com"只支持TLS加密。因此我无法使用 CredentialCache.DefaultNetworkCredentials 自动编码我的 Windows 登录密码。

        var smtpClient = new SmtpClient("smtp.oldserver.com")
        {
            Credentials = CredentialCache.DefaultNetworkCredentials
        };

        const string from = "myemail@xyz.com";
        const string recipients = "myemail@xyz.com";
        smtpClient.Send(from, recipients, "Test Subject", "Test Body");

以前这没有任何问题。但是如果我现在将上面的代码片段更改为:

        var smtpClient = new SmtpClient("smtp.office365.com");
        smtpClient.EnableSsl = true;
        smtpClient.Port = 587;
        smtpClient.Credentials = CredentialCache.DefaultNetworkCredentials;

我现在得到:

Unhandled Exception: System.Net.Mail.SmtpException: The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.7.57 SMTP; Client was not authenticated to send anonymous mail during MAIL FROM

但是如果我在代码中指定我的 Windows 登录用户名和密码,它就可以正常工作:

smtpClient.Credentials = new NetworkCredential("myemail@xyz.com", "mypassword");

所以:

  1. 是否可以使用 DefaultNetworkCredentials 对密码进行编码,但使其在 TLS 加密下可用?
  2. 如果 1. 不可能,是否有更好的方法在别处对我的 Windows 密码进行编码,而不直接在代码中将其显示为明文?

在我的情况下,我对存储这些凭据的 web.config 部分进行了加密。我同样在我的数据库中存储了凭据的加密版本,并有一个在应用程序中解密它们的例程。

凭证和加密这两个主题是不相关的。 DefaultNetworkCredentials 仅在邮件服务器和您的计算机属于同一 "network" 或更准确地说是同一或连接的 Active Directory 服务器时才有效。我猜旧的 SMTP 服务器是在内部部署的,并且是您办公室网络的一部分。 O365服务器在云端,不共享AD。

当您明确提供凭据时,它会起作用,因为 O365 能够对您进行身份验证。

可以使用 Azure Active Directory 并以某种方式将其连接到您的本地 Active Directory。我不熟悉细节,但我知道这是可以做到的。我相信如果您正确设置它,DefaultNetworkCredentials 将再次开始工作。

O365认证详情:https://blogs.office.com/2014/05/13/choosing-a-sign-in-model-for-office-365/

如果需要存储密码,需要加密存储。看到这个答案:Best way to store encryption keys in .NET C#