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)

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top