2012-05-03 4 views
5

Wie können Anfragen an /elmah.axd auf Umbraco Admin Benutzer begrenzt werden.Wie sichere ich die ELMAH Webkonsole in Umbraco?

Es ist mein Verständnis, dass die Umbraco Mitgliedschafts- und Rollenanbieter Umbraco gelten Mitglieder aber nicht Benutzer - Umbraco Benutzerkonten werden nicht angezeigt, einen Benutzernamen oder eine Rolle zu haben (zB „Admins“), die sein könnte in der web.config wie folgt verwendet:

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

Dies ist ein empfohlene Weg ELMAH in anderen ASP.Net-Anwendungen zu sichern.

Wer hat das in Umbraco getan?

Antwort

6

ich das Problem, indem ein HTTP-Modul gelöst abfangen Anfragen elmah.axd und autorisieren nur Umbraco-Administratoren, um es anzuzeigen. Heres das Modul Code:

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); 
     } 
    } 
} 

... und die 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

Sehr ordentlich! Vielen Dank JonH! – Karl

+0

Danke dafür - funktioniert gut für meine Umbraco 4 Seite - aber leider die Zeile user = User.GetCurrent() gibt immer Null auf meiner Umbraco 7 Seite zurück. Auch bei autorisierten Anfragen an das Backoffice! Hast du eine Ahnung warum? Vielen Dank! –

0

Ich glaube, Sie haben ELMAH zu ändern, um es richtig mit Umbraco zu integrieren zu bekommen

Diese article könnte das sein, was Sie suchen

+0

Das Problem mit Abfangen von Anfragen an den Elmah dynamischen Ressourcenhandler (elmah.axd) zu tun hat, und nur die Genehmigung Umbraco Admin-Benutzer, um es anzuzeigen. – JonH

Verwandte Themen