Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用应用程序池凭据发送电子邮件_C#_Asp.net_Asp.net Mvc_Smtpclient_System.net - Fatal编程技术网

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

C# 使用应用程序池凭据发送电子邮件,c#,asp.net,asp.net-mvc,smtpclient,system.net,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> 基于,我

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

我们的web.config如下所示:

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

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

深入研究System.Net代码,defaultCredentials选项似乎会导致我们使用CredentialCache.defaultCredentials属性,该属性使用空用户名和密码填充凭据。因此,这可能是问题的原因

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

我们希望应用程序池进行身份验证,以便在应用程序遇到错误并向我们发送电子邮件时禁用邮箱(这种情况已经发生)


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

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

SmtpClient client = new SmtpClient(); 
client.UseDefaultCredentials = false;
client.Credentials=new NetworkCredential("myusername","mypassword");
这将使用指定的用户名和密码。如果需要,您可以从加密文件或web服务或其他安全位置检索用户名和密码


另一种选择是。

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

然后,如果您以用户身份运行应用程序池。该用户名和密码可以在针对网络的更大规模攻击中获得和使用,因此,如果可以运行随机应用程序来获取有效本地/域用户的凭据,则会带来更大的安全风险。或者更糟糕的是,您能想象桌面.NET应用程序正在运行,并且能够检索当前正在运行的用户凭据吗?如果你能检索到这样的凭证,事情会很快发展下去


您有几个选项,包括使用web服务发送电子邮件、创建本地SMTP服务器(仅允许从特定IP地址进行未经验证的访问)、在应用程序代码中输入用户名和密码、加密web.config(这两个选项都在mason的回答中)。可能还有更多的选择,我现在还想不出来。可能需要在您的基础架构中使用系统管理员,以查看哪些选项是可行的。

您使用的是集成身份验证吗?如果您是这样要求的,我们不会向用户传递凭据。我们已将应用程序池设置为某个域帐户,正在使用IUSR匿名帐户访问磁盘上的元素。这将返回什么
System.Security.Principal.WindowsIdentity.GetCurrent().Name
我们的安全人员不希望开发人员能够访问凭据或知道其加密位置。开发人员必须知道其位置。如果他们找不到就不能用。只需让一个低特权帐户发送电子邮件即可。存储加密的密码,这样他们就看不到了。