59

我在尝试保护 ELMAH 时遇到了麻烦。我遵循了 Phil Haacked 的教程,唯一的区别是演示项目是一个 Web 应用程序,而我的项目是一个网站。

   <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 安全,同时保持远程查看日志的能力?

谢谢。

其他人请注意:
按照艾伦的以下回答,结果如下。

www.mysite.com/admin/elmah.axd - 触发身份验证
www.mysite.com/admin/asdasdasd/elmah.axd - 触发身份验证
www.mysite.com/asdasdasd/admin/elmah.axd - 资源不能成立。(正是我们想要的)

4

4 回答 4

70

我玩弄了 web.config 并得到了以下工作。基本上,不是将 elmah.axd HttpHandler 放在一般的 system.web 中,而是将其专门添加到您的“管理员”路径位置的 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>
于 2009-08-10T16:29:52.060 回答
25

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

routes.IgnoreRoute("admin/elmah.axd/{*pathInfo}");
于 2010-10-14T23:32:34.427 回答
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.Net MVC,请添加

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

在您的 RegisterRoutes 方法中。

于 2011-06-07T16:56:27.623 回答
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 的任何建议?

谢谢。

于 2010-08-12T12:59:08.530 回答