Обеспечение Elmah в ASP.NET сайт
-
12-09-2019 - |
Вопрос
У меня возникли проблемы при попытке заполучить ЭЛМАХА.Я следил за работой Фила Хаака Учебник, с той лишь разницей, что демонстрационный проект - это веб-приложение, а мой проект - веб-сайт.
<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 - Ресурс не может быть найден.(именно то, что мы хотели)
Решение
Я поигрался с web.config и заработал следующее.По сути, вместо того, чтобы помещать HttpHandler elmah.axd в общий файл 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>
Другие советы
Если вы используете ASP.NET MVC, вам понадобится, чтобы механизм маршрутизации игнорировал этот путь.Если вы хотите переместить elmah, например, в /admin/elmah.axd, вам следует добавить в Global.asax.cs следующее:
routes.IgnoreRoute("admin/elmah.axd/{*pathInfo}");
Потратив некоторое время на то, чтобы заставить это работать, объединив различные советы из каждого ответа, я собрал полное решение, которое должно работать для всех разновидностей 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.
В 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?
Спасибо.