在 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");
所以:
- 是否可以使用
DefaultNetworkCredentials
对密码进行编码,但使其在 TLS 加密下可用?
- 如果 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#
我们公司正在将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");
所以:
- 是否可以使用
DefaultNetworkCredentials
对密码进行编码,但使其在 TLS 加密下可用? - 如果 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#