使用应用程序池凭据发送电子邮件

时间:2014-06-17 20:42:17

标签: c# asp.net asp.net-mvc smtpclient system.net

我们有一个asp.net应用程序负责发送我们的产品电子邮件。我们希望使用应用程序池帐户将经过身份验证的电子邮件发送到我们的Exchange服务器。

我们的web.config如下所示:

  <smtp deliveryMethod="Network" from="support@company.com">
    <network host="mail.company.com" defaultCredentials="true"/>
  </smtp>

基于the msdn docs,我希望这会在发送电子邮件时使用应用池凭据。但是,在运行时不会尝试进行身份验证。

深入了解System.Net代码,看起来defaultCredentials选项将导致我们使用CredentialCache.DefaultCredentials属性,该属性使用空用户名和密码填充凭据。因此,这可能是问题的原因。

出于安全考虑,我们不希望在smtp配置部分中填充显式用户名和密码。我们根本不想使用开放式中继(这是我们目前正在使用的),因为我们没有办法限制或停止电子邮件。

我们希望应用程序池进行身份验证,因此我们可以在应用程序遇到错误的情况下禁用邮箱,并使用电子邮件(已经发生)来阻止我们。

我们如何配置应用程序以使用应用程序池凭据发送经过身份验证的电子邮件?

2 个答案:

答案 0 :(得分:0)

在发送电子邮件的代码中,执行以下操作...

SmtpClient client = new SmtpClient(); 
client.UseDefaultCredentials = false;
client.Credentials=new NetworkCredential("myusername","mypassword");

这将使用指定的用户名和密码。如果需要,您可以从加密文件或Web服务或其他安全位置检索用户名和密码。

另一种选择是encrypting your configuration file

答案 1 :(得分:0)

我怀疑这是不可能的,因为SMTP在大多数情况下需要用户名和密码进行身份验证。如果您在任何内置帐户(如NETWORK SERVICEApplicationPoolIdentity)下运行应用程序池,则基本上没有要传递给SMTP使用的凭据。或者为了使它们工作,将使用一些疯狂形式的非标准Windows身份验证,超出标准的SMTP规范。

然后,如果您以用户the username and password are stored in encrypted, but reversible, format on the server的身份运行应用程序池。可以获取该用户名和密码并用于针对网络的更大规模攻击,因此如果可以运行随机应用程序以获得有效本地/域用户的凭证,则其具有更大的安全风险。或者更糟糕的是,您能想象一个桌面.NET应用程序在运行,并能够检索当前运行的用户凭据吗?如果您能够检索这样的凭证,那么事情会快速下降。

您有几个选项,包括使用网络服务发送电子邮件,创建本地SMTP服务器,允许仅从特定IP地址进行未经身份验证的访问,将用户名和密码放在应用程序代码中,加密网络.config(梅森的两个选项)。可能还有一些我无法在第二时间提出的选项。可能希望在基础架构中使用系统管理员来查看哪些选项是可行的。