2009-08-07 23 views
57

Tengo problemas para proteger a ELMAH. Seguí el tutorial de Phil Haacked, con la única diferencia de que el proyecto de demostración es una aplicación web y mi proyecto es un sitio web.Protección de Elmah en el sitio web de ASP.NET

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

Con el principal "/" Recibo la respuesta que "El recurso no puede ser encontrado.", Si quito el líder de todo "/" trabaja muy bien a excepción de autenticación puede ser pasado por alto si se añade un nombre de directorio delante de /admin/elmah.axd.

Por ejemplo, sin la guía "/"

www.mysite.com/admin/elmah.axd - desencadena la autenticación
www.mysite.com/asdasdasd/admin/elmah.axd - No gatillo la autenticación y muestra ELMAH

¿Cómo puedo asegurarme de que ELMAH es seguro mientras mantengo la capacidad de ver el registro de forma remota?

Gracias.

Nota para otros:
A continuación la respuesta de Alan a continuación resulta en lo siguiente.

www.mysite.com/admin/elmah.axd - desencadena la autenticación
www.mysite.com/admin/asdasdasd/elmah.axd - desencadena la autenticación
www.mysite.com/asdasdasd/admin/ elmah.axd - El recurso no puede ser encontrado. (exactamente lo que queríamos)

Respuesta

70

He jugado con el web.config y he conseguido que lo siguiente funcione. Básicamente, en lugar de poner el elmah.axd HttpHandler en el sistema general.web, agrégalo específicamente en el sistema. Web de tu ubicación de ruta "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> 
+8

si está utilizando asp.net mvc no olvide agregar: routes.IgnoreRoute ("admin/elmah.axd/{* pathInfo}"); – santiagoIT

+0

Problemas sobre la seguridad y *** ELMAH ***: http://geeks.ms/lruiz/2014/07/21/asp-net-revisa-la-configuracin-de-elmah-en-produccin/ –

1

En IIS 7.5 windows server 2008, hay otra sección llamada system.webServer. Para que ELMAH funcione, esto tenía que ser añadido:

<system.webServer> 
    <handlers> 
    <add name="Elmah" verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" /> 
    </handlers> 
</system.webServer> 

que he probado unas cuantas variaciones, pero soy incapaz de utilizar la solución anterior para prevenir '/blah/elmah.axd' de trabajando.

Cualquier sugerencia para hacer que la solución anterior funcione para IIS 7.x?

Gracias.

+0

Una vez que eliminé el elmah.axd de la sección httpHandlers de system.web y de los controladores en system.webserver, ahora obtengo el error 404. Tengo mi ubicación path = "admin" exactamente como lo sugirió Alan. Ejecutando IIS 7.5. – InvisibleMan1002

+0

@Dan Atkinson que es una declaración inexacta. Si aloja en IIS 7+, debe registrar HttpHandlers y HttpModules en la sección de configuración 'system.webServer'. –

+0

@ChrisMarisic: Ya sabes, ¡tienes toda la razón! Me he retractado (eliminado) mi declaración anterior. Gracias por corregirme. :) –

25

Si está utilizando ASP.NET MVC, necesitará que el motor de enrutamiento ignore esa ruta. Si desea mover ELMAH a /admin/elmah.axd, por ejemplo, se debe añadir lo siguiente a Global.asax.cs:

routes.IgnoreRoute("admin/elmah.axd/{*pathInfo}"); 
+0

Esto resolvió mi problema en MVC, pero supongo que la pregunta original no era sobre ASP.NET MVC. – pauloya

+0

+1 para especificar el arreglo específico de MVC. Trabajó para mí en MVC3. Sin ella, la respuesta de Alan no funcionará en MVC. – N30

+0

@Paulo, la pregunta no especifica Webforms o MVC. ASP.NET es la base para ambos, así que incluyó este bit adicional que necesitaría para MVC. – aarondcoleman

17

Después de haber pasado un tiempo tratando de conseguir que esto funcione mediante parches juntos los diversos bits de consejos de cada una de las respuestas, he creado una solución completa que debería funcionar para todos los gustos de IIS.

Esto es lo que tiene que estar en cada una de sus secciones 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> 

y si usted está utilizando Asp.Net MVC, agregue

routes.IgnoreRoute("admin/elmah.axd/{*pathInfo}"); 

en su método RegisterRoutes.

Cuestiones relacionadas