Protegendo Elmah no site ASP.NET
-
12-09-2019 - |
Pergunta
Estou tendo problemas para tentar garantir ELMAH. Tenho seguido de Phil Haacked tutorial , com a única diferença sendo o projeto de demonstração é uma aplicação web e meu projeto é um website.
<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>
Com o líder "/" I receber a resposta de que "O recurso não pode ser encontrado.", Se eu remover o líder "/" tudo funciona bem, exceto a autenticação pode ser contornado anexando um nome de diretório na frente de / admin / elmah.axd.
Por exemplo, sem o líder "/"
www.mysite.com/admin/elmah.axd - desencadeia a autenticação
www.mysite.com/asdasdasd/admin/elmah.axd - não aciona a autenticação e exibe ELMAH
Como posso garantir que ELMAH é seguro, mantendo a capacidade de visualizar remotamente o log?
Graças.
Nota para os outros:
Após a resposta de Alan abaixo resulta no seguinte.
www.mysite.com/admin/elmah.axd - desencadeia a autenticação
www.mysite.com/admin/asdasdasd/elmah.axd - desencadeia a autenticação
www.mysite.com/asdasdasd/admin/elmah.axd - O recurso não pode ser encontrado. (Exatamente o que queríamos)
Solução
Eu brinquei com o web.config e tem o seguinte para o trabalho. Basicamente, em vez de colocar o elmah.axd HttpHandler no system.web geral, adicioná-lo especificamente no system.web do seu "admin" local do caminho.
<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>
Outras dicas
Se você estiver usando ASP.NET MVC, você vai precisar de ter o mecanismo de roteamento ignorar esse caminho. Se você deseja mover elmah para /admin/elmah.axd por exemplo, você deve adicionar o seguinte para Global.asax.cs:
routes.IgnoreRoute("admin/elmah.axd/{*pathInfo}");
Depois de ter passado um tempo tentando chegar a este trabalho de remendar os vários pedaços de conselhos de cada uma das respostas, eu coloquei uma solução completa que deve funcionar para todos os sabores de IIS.
Aqui está o que precisa estar em cada uma de suas seções 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>
E se você está usando Asp.Net MVC, adicione
routes.IgnoreRoute("admin/elmah.axd/{*pathInfo}");
em seu método RegisterRoutes.
No IIS Server 7.5 Windows 2008, há uma outra seção chamada system.webServer. Para que o ELMAH para trabalhar, isso tinha que ser adicionados:
<system.webServer>
<handlers>
<add name="Elmah" verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
</handlers>
</system.webServer>
Eu tentei algumas variações, mas eu sou incapaz de usar a solução acima para prevenir '/Blah/elmah.axd' de trabalho.
Todas as sugestões sobre como fazer o trabalho solução acima para o IIS 7.x?
Graças.