使用App Pool凭据发送电子邮件
本文关键字:电子邮件 App Pool 使用 | 更新日期: 2023-09-27 18:09:06
我们有一个asp.net应用程序,负责发送我们的产品电子邮件。我们希望使用应用程序池帐户向我们的交换服务器发送经过身份验证的电子邮件。
我们的网页。配置如下:
<smtp deliveryMethod="Network" from="support@company.com">
<network host="mail.company.com" defaultCredentials="true"/>
</smtp>
根据msdn文档,我希望在发送电子邮件时使用应用程序池凭据。但是,在运行时不会尝试进行身份验证。
深入系统。Net代码中,看起来defaultCredentials选项将导致我们使用CredentialCache。DefaultCredentials属性,该属性使用空的用户名和密码填充凭据。因此,这可能是问题的原因。
出于安全考虑,我们不希望在smtp配置部分中填充显式的用户名和密码。我们根本不想使用开放中继(这是我们目前正在使用的),因为我们没有办法限制或停止电子邮件。
我们希望应用程序池进行身份验证,因此我们可以在应用程序遇到错误并向我们发送电子邮件的情况下禁用邮箱(这已经发生了)。
我们如何配置我们的应用程序来使用应用程序池凭据来发送经过身份验证的电子邮件?
在发送电子邮件的代码中,执行如下操作…
SmtpClient client = new SmtpClient();
client.UseDefaultCredentials = false;
client.Credentials=new NetworkCredential("myusername","mypassword");
将使用指定的用户名和密码。如果需要,您可以从加密文件或web服务或其他安全位置检索用户名和密码。
我怀疑这是不可能的,因为SMTP在大多数情况下需要用户名和密码进行身份验证。如果您在任何内置帐户(如NETWORK SERVICE
或ApplicationPoolIdentity
)下运行应用程序池,则基本上没有凭据可以传递给SMTP使用。或者要使它们工作,将超出标准SMTP规范,使用一些疯狂的非标准Windows身份验证形式。
然后,如果您以用户身份运行应用程序池,则用户名和密码将以加密但可逆的格式存储在服务器上。该用户名和密码可以被获取并用于针对网络的大规模攻击,因此如果可以运行随机应用程序来获取有效的本地/域用户的凭据,则安全风险更大。或者更糟的是,您能想象一个正在运行的桌面.NET应用程序,并且能够检索当前正在运行的用户凭据吗?如果你能像那样检索凭证,事情就会迅速恶化。
你有几个选项,包括使用web服务发送电子邮件,创建一个本地SMTP服务器,允许未经身份验证的访问仅从某些IP地址,把用户名和密码在应用程序代码,加密web。配置(这两个选项在梅森的回答)。可能还有更多的选择,我现在还想不出来。可能需要在您的基础设施中找一个系统管理员,看看哪些选项是可行的。