Защита Elmah на веб-сайте ASP.NET - PullRequest
59 голосов
/ 07 августа 2009

У меня проблемы с попыткой обезопасить 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, сохраняя возможность удаленного просмотра журнала?

Спасибо.

Примечание для других:
Следующий ответ Алана приводит к следующему.

www.mysite.com / admin / elmah.axd - запускает аутентификацию
www.mysite.com/admin/asdasdasd/elmah.axd - запускает аутентификацию
www.mysite.com/asdasdasd/admin/elmah.axd - ресурс не найден. (именно то, что мы хотели)

Ответы [ 4 ]

70 голосов
/ 10 августа 2009

Я поигрался с web.config и получил следующее для работы.По сути, вместо того, чтобы помещать elmah.axd HttpHandler в общий system.web, добавьте его специально в system.web вашего местоположения «admin».

<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>
25 голосов
/ 15 октября 2010

Если вы используете ASP.NET MVC, вам нужно, чтобы механизм маршрутизации игнорировал этот путь. Например, если вы хотите переместить elmah в /admin/elmah.axd, добавьте в Global.asax.cs следующее:

routes.IgnoreRoute("admin/elmah.axd/{*pathInfo}");
17 голосов
/ 07 июня 2011

Потратив некоторое время, пытаясь заставить это работать, исправляя различные советы из каждого ответа, я собрал полное решение, которое должно работать для всех разновидностей 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.

1 голос
/ 12 августа 2010

В 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?

Спасибо.

...