我继承了一个使用 ASP.NET MVC 编写的遗留内部站点。它使用 Elmah 来邮寄未捕获的异常。不幸的是,这些电子邮件包含敏感信息,例如密码。按照本指南,我实现了这个
ErrorLogModule
类以从错误报告中删除敏感字段:
using Elmah;
using System.Linq;
using ElmahErrorLogModule = Elmah.ErrorLogModule;
namespace HRCommittee
{
// method taken and modified from https://stackoverflow.com/a/24914392/713735
public class ErrorLogModule : ElmahErrorLogModule
{
protected override void OnErrorSignaled(object sender, ErrorSignalEventArgs args)
{
string[] serverVariables = args.Context.Request.ServerVariables.AllKeys;
string[] varsToRemove = { "AUTH_PASSWORD", "HTTP_COOKIE", "ALL_HTTP", "ALL_RAW" };
if (serverVariables != null)
{
foreach (string var in varsToRemove)
{
if (serverVariables.Contains(var))
{
args.Context.Request.ServerVariables.Remove(var);
}
}
}
base.OnErrorSignaled(sender, args);
}
}
}
但是,电子邮件没有改变。此外,在实现上述代码后,我看到其他人在另一个位置放置了与我链接的指南相同的文件,但也没有成功。由于 Elmah 几乎没有文档记录,而且我对 Microsoft 堆栈还很陌生,因此我一直在努力找出问题所在。
顺便说一下,
web.config
中的相关条目讲述了一些已经尝试过的故事:
<system.webServer>
<modules>
<remove name="FormsAuthentication" />
<!--<add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" />-->
<!--<add name="ErrorLog" type="HRCommittee.App_Start.ErrorLogModule" preCondition="managedHandler" />-->
<add name="ErrorLog" type="HRCommittee.ErrorLogModule" preCondition="managedHandler" />
<add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" preCondition="managedHandler" />
<add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" preCondition="managedHandler" />
</modules>
<!-- other stuff -->
</system.webServer>
我错过了什么?