2009-08-07 55 views
57

我在尝试安全ELMAH时遇到问题。我遵循了Phil Haacked的tutorial,唯一的区别是演示项目是一个web应用程序,我的项目是一个网站。在ASP.NET网站中保护Elmah

<add verb="POST,GET,HEAD" path="/admin/elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" /> 

    <location path="admin"> 
     <system.web> 
      <authorization> 
       <deny users="?"/> 
      </authorization> 
     </system.web> 
    </location> 

凭借领先的“/”我收到的响应“的资源不能被发现。”,除了认证,如果我删除开头的“/”一切正常,可以通过附加在前面的目录名被忽略/admin/elmah.axd。

例如没有前导 “/”

www.mysite.com/admin/elmah.axd - 触发认证
www.mysite.com/asdasdasd/admin/elmah.axd - 不触发验证和显示ELMAH

如何确保ELMAH在保持远程查看日志的能力的同时安全?

谢谢。

给他人的提示:
以下Alan的回答如下。

www.mysite.com/admin/elmah.axd - 触发认证
www.mysite.com/admin/asdasdasd/elmah.axd - 触发认证
www.mysite.com/asdasdasd/admin/ elmah.axd - 找不到资源。 (正是我们想要的)

回答

70

我玩过web.config并得到以下工作。基本上,不要将elmah.axd HttpHandler放入常规system.web中,而是将其专门添加到“admin”路径位置的system.web中。

<location path="admin"> 
    <system.web> 
     <httpHandlers> 
      <add verb="POST,GET,HEAD" path="elmah.axd" 
       type="Elmah.ErrorLogPageFactory, Elmah" /> 
     </httpHandlers> 
     <authorization> 
      <deny users="?"/> 
     </authorization> 
    </system.web> 
</location> 
+8

如果您使用的是asp.net mvc,请不要忘记添加: routes.IgnoreRoute(“admin/elmah.axd/{* pathInfo}”); – santiagoIT 2011-08-30 02:51:01

+0

有关安全和*** ELMAH ***的问题:http://geeks.ms/lruiz/2014/07/21/asp-net-revisa-la-configuracin-de-elmah-en-produccin/ – 2016-06-25 10:11:46

1

在IIS 7.5 windows server 2008中,有另一个名为system.webServer的部分。 为了ELMAH工作,这不得不说:

<system.webServer> 
    <handlers> 
    <add name="Elmah" verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" /> 
    </handlers> 
</system.webServer> 

我已经尝试了一些变化,但我无法使用上述解决方案,以防止 从“/blah/elmah.axd”加工。

任何关于使上述解决方案适用于IIS 7.x的建议?

谢谢。

+0

一旦我从system.web的httpHandlers部分和system.webserver下的处理程序中删除了elmah.axd,现在我得到了404错误。 我有我的位置路径=“管理员”就像艾伦建议的。 运行IIS 7.5。 – InvisibleMan1002 2010-08-12 20:06:53

+0

@Dan Atkinson这是一个不准确的陈述。如果您在IIS 7 +中托管,则必须在'system.webServer'配置部分中注册HttpHandlers和HttpModules。 – 2011-04-02 01:25:36

+0

@ChrisMarisic:你知道,你是对的!我已收回(删除)我先前的发言。谢谢你纠正我。 :) – 2011-04-02 10:54:29

25

如果您使用的是ASP.NET MVC,则需要让路由引擎忽略该路径。如果要移动到ELMAH为/admin/elmah.axd比如,你应该添加以下的Global.asax.cs:

routes.IgnoreRoute("admin/elmah.axd/{*pathInfo}"); 
+0

这解决了我在MVC上的问题,但我想原来的问题不是关于ASP.NET MVC。 – pauloya 2011-02-05 18:19:16

+0

+1用于指定MVC特定修复。在MVC3中为我工作。没有它@艾伦的答案将无法在MVC中工作。 – N30 2011-05-13 21:34:58

+0

@Paulo,问题没有指定Webforms或MVC。 ASP.NET是两者的基础,所以包含了MVC所需的额外位。 – aarondcoleman 2012-08-17 01:09:03

17

在花了一段时间试图让这个由各个位拼凑工作来自每个答案的建议,我已经提出了一个适用于所有类型IIS的完整解决方案。

下面是需要在每个你的web.config部分:

<configuration> 
    <configSections> 
    <sectionGroup name="elmah"> 
     <section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah" /> 
     <section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah" /> 
     <section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah" /> 
     <section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah" /> 
    </sectionGroup> 
    </configSections> 

    <elmah> 
    <!-- set allowRemoteAccess="0" for extra security --> 
    <security allowRemoteAccess="1"/> 
    </elmah> 

    <system.web> 
    <httpModules> 
     <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" /> 
     <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" /> 
     <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" /> 
    </httpModules> 
    </system.web> 

    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"> 
     <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" /> 
     <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" preCondition="managedHandler" /> 
     <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" preCondition="managedHandler" /> 
    </modules> 
    </system.webServer> 

    <location path="admin"> 
    <system.web> 
     <authorization> 
     <!--<allow users="Admin" /> --> 
     <deny users="?" /> 
     </authorization> 
     <httpHandlers> 
     <add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" /> 
     </httpHandlers> 
    </system.web> 
    <system.webServer> 
     <handlers> 
     <add name="Elmah" path="elmah.axd" verb="POST,GET,HEAD" type="Elmah.ErrorLogPageFactory, Elmah" preCondition="integratedMode" /> 
     </handlers> 
    </system.webServer> 
    </location> 

</configuration> 

如果你正在使用ASP。网络MVC,在您的RegisterRoutes方法中添加

routes.IgnoreRoute("admin/elmah.axd/{*pathInfo}");