2012-05-03 11 views
5

¿Cómo pueden las solicitudes de /elmah.axd limitarse a Umbraco admin user.¿Cómo asegurar la consola web ELMAH en Umbraco?

Es mi entendimiento de que los proveedores de pertenencia y el papel Umbraco Umbraco se aplican a los miembros pero no Usuarios - cuentas de usuario Umbraco no parecen tener un nombre de usuario o función (por ejemplo, "Administradores") que podrían ser utilizado en el web.config como esto:

<location path="elmah.axd"> 
    <system.web> 
    <authorization> 
     <allow roles="Admins" /> 
     <deny users="*" /> 
    </authorization> 
    </system.web> 
</location> 

este es un método recomendado para asegurar ELMAH en otras aplicaciones ASP.NET.

¿Alguien ha hecho esto en Umbraco?

Respuesta

6

He resuelto el problema mediante la creación de un módulo HTTP para interceptar las peticiones a elmah.axd, y autoriza solo a los administradores de Umbraco para verlo. Aquí está el código del módulo:

namespace MyNamespace 
{ 
    using System; 
    using System.Configuration; 
    using System.Web; 
    using System.Web.Configuration; 

    using umbraco.BusinessLogic; 

    public class ElmahSecurityModule : IHttpModule 
    { 
     private HttpApplication _context; 

     public void Dispose() 
     { 
     } 

     public void Init(HttpApplication context) 
     { 
      this._context = context; 
      this._context.BeginRequest += this.BeginRequest; 
     } 

     private void BeginRequest(object sender, EventArgs e) 
     { 
      var handlerPath = string.Empty; 

      var systemWebServerSection = (HttpHandlersSection)ConfigurationManager.GetSection("system.web/httpHandlers"); 

      foreach (HttpHandlerAction handler in systemWebServerSection.Handlers) 
      { 
       if (handler.Type.Trim() == "Elmah.ErrorLogPageFactory, Elmah") 
       { 
        handlerPath = handler.Path.ToLower(); 
        break; 
       } 
      } 

      if (string.IsNullOrWhiteSpace(handlerPath) || !this._context.Request.Path.ToLower().Contains(handlerPath)) 
      { 
       return; 
      } 

      var user = User.GetCurrent(); 

      if (user != null) 
      { 
       if (user.UserType.Name == "Administrators") 
       { 
        return; 
       } 
      } 

      var customErrorsSection = (CustomErrorsSection)ConfigurationManager.GetSection("system.web/customErrors"); 

      var defaultRedirect = customErrorsSection.DefaultRedirect ?? "/"; 

      this._context.Context.RewritePath(defaultRedirect); 
     } 
    } 
} 

... y el web.config:

<configuration> 
    <system.web> 
     <httpModules> 
      <add name="ElmahSecurityModule" type="MyNamespace.ElmahSecurityModule" /> 
     </httpModules> 
    </system.web> 
    <system.webServer> 
     <modules runAllManagedModulesForAllRequests="true"> 
      <add name="ElmahSecurityModule" type="MyNamespace.ElmahSecurityModule" /> 
     </modules> 
    </system.webServer> 
</configuration> 
+0

¡Muy limpio! Muchas gracias JonH! – Karl

+0

Gracias por esto, funciona muy bien para mi sitio Umbraco 4, pero desafortunadamente la línea user = User.GetCurrent() siempre devuelve null en mi sitio Umbraco 7. ¡Incluso cuando maneja solicitudes autorizadas a la oficina virtual! ¿Tienes alguna idea de por qué? ¡Gracias! –

0

yo creo que hay que modificar ELMAH para conseguir que se integre correctamente con Umbraco

Este article podría ser lo que estás buscando

+0

El problema tiene que ver con la interceptación de peticiones al controlador de recursos dinámica Elmah (elmah.axd), y autorizar únicamente Usuarios de administrador de Umbraco para verlo. – JonH