【问题标题】:Securing Elmah in ASP.NET website在 ASP.NET 网站中保护 Elmah
【发布时间】:2010-11-17 17:42:44
【问题描述】:

我在尝试保护 ELMAH 时遇到了麻烦。我关注了 Phil Haacked 的 tutorial,唯一的区别是演示项目是一个 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 安全,同时保持远程查看日志的能力?

谢谢。

给其他人的注意事项:
遵循 Alan 在下面的回答会产生以下结果。

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

【问题讨论】:

    标签: .net asp.net web-config elmah


    【解决方案1】:

    我玩弄了 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>
    

    【讨论】:

    • 如果你使用的是asp.net mvc,别忘了添加:routes.IgnoreRoute("admin/elmah.axd/{*pathInfo}");
    • 关于安全和ELMAH的问题:geeks.ms/lruiz/2014/07/21/…
    【解决方案2】:

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

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

    【讨论】:

    • 这解决了我在 MVC 上的问题,但我猜最初的问题与 ASP.NET MVC 无关。
    • +1 用于指定 MVC 特定修复。在 MVC3 中为我工作。没有它@Alan 的答案将无法在 MVC 中工作。
    • @Paulo,该问题未指定 Webforms 或 MVC。 ASP.NET 是两者的基础,因此包含了 MVC 所需的额外部分。
    • @aarondcoleman 因为这不是问题的直接答案(正如您自己指出的那样),您应该将其添加为问题或答案的评论,或者编辑接受的答案以添加MVC 位。您不应该仅仅将其作为一个答案,因为它本身作为一个答案是不完整的,并且只会导致奇怪的投票结果超过接受的答案投票,而没有直接的理由。
    【解决方案3】:

    我花了一段时间试图通过将每个答案中的各种建议拼凑在一起来实现这一点,我已经制定了一个完整的解决方案,该解决方案应该适用于所有类型的 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 方法中。

    【讨论】:

      【解决方案4】:

      在 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 的任何建议?

      谢谢。

      【讨论】:

      • 从 system.web 的 httpHandlers 部分和 system.webserver 下的处理程序中删除 elmah.axd 后,我现在收到 404 错误。我的位置 path="admin" 与艾伦建议的完全一样。运行 IIS 7.5。
      • @Dan Atkinson 这是一个不准确的陈述。如果您在 IIS 7+ 中托管,则必须在 system.webServer 配置部分注册 HttpHandlers 和 HttpModules。
      • @ChrisMarisic:你知道,你完全正确!我已撤回(删除)我之前的声明。谢谢你纠正我。 :)
      • 需要将system.webserver添加到location部分
      猜你喜欢
      • 2023-03-28
      • 2011-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-27
      • 2011-09-18
      相关资源
      最近更新 更多