2012-05-03 12 views
5

W jaki sposób wnioski do /elmah.axd mogą być ograniczone do użytkownika administracyjnego Umbraco.Jak zabezpieczyć konsolę internetową ELMAH w Umbraco?

To jest moje zrozumienie, że członkostwo i rola dostawcy Umbraco zastosowanie do Umbraco Członkowie ale nie Użytkownicy - konta użytkowników Umbraco nie wydają się mieć nazwę użytkownika lub rolę (np „Administratorzy”), które mogłyby być używane w web.config w ten sposób:

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

Jest to zalecany sposób zabezpieczenia programu ELMAH w innych aplikacjach ASP.Net.

Ktoś zrobił to w Umbraco?

Odpowiedz

6

I rozwiązać problem poprzez stworzenie modułu HTTP do przechwytywania żądań do elmah.axd i upoważnia tylko administratorów Umbraco do oglądania go. Herezje Kod modułu:

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

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

Bardzo zadbane! Dziękuję bardzo JonH! – Karl

+0

Dziękuję za to - działa świetnie na mojej stronie Umbraco 4 - ale niestety użytkownik line = User.GetCurrent() zawsze zwraca wartość null w mojej witrynie Umbraco 7. Nawet podczas obsługiwania autoryzowanych próśb do zaplecza! Czy masz jakiś pomysł, dlaczego? Dzięki! –

0

Myślę, że trzeba zmodyfikować ELMAH aby ją poprawnie zintegrować z Umbraco

Ten article może być to, czego szukasz

+0

Problem ma do czynienia z przechwytywaniem żądań do obsługi ELMAH dynamicznych zasobów (elmah.axd) i upoważniającej tylko Administratorzy Umbraco mogą go oglądać. – JonH