Защита Elmah на веб-сайте ASP.NET
У меня возникли проблемы с попыткой защитить ELMAH. Я последовал за Phil Haacked учебник, с той лишь разницей, что демонстрационный проект - это веб-приложение, а мой проект - веб-сайт.
<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 - Ресурс не найден. (именно то, что мы хотели)
Ответы
Ответ 1
Я играл с 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>
Ответ 2
Если вы используете ASP.NET MVC, вам понадобится, чтобы механизм маршрутизации игнорировал этот путь. Если вы хотите переместить elmah в /admin/elmah.axd, например, вы должны добавить следующее в Global.asax.cs:
routes.IgnoreRoute("admin/elmah.axd/{*pathInfo}");
Ответ 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?
Спасибо.