2009-08-07 103 views
57

我在嘗試安全ELMAH時遇到問題。我遵循了Phil Haacked的tutorial,唯一的區別是演示項目是一個web應用程序,我的項目是一個網站。在ASP.NET網站中保護Elmah

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

憑藉領先的「/」我收到的響應「的資源不能被發現。」,除了認證,如果我刪除開頭的「/」一切正常,可以通過附加在前面的目錄名被忽略/admin/elmah.axd。

例如沒有前導 「/」

www.mysite.com/admin/elmah.axd - 觸發認證
www.mysite.com/asdasdasd/admin/elmah.axd - 不觸發驗證和顯示ELMAH

如何確保ELMAH在保持遠程查看日誌的能力的同時安全?

謝謝。

給他人的提示:
以下Alan的回答如下。

www.mysite.com/admin/elmah.axd - 觸發認證
www.mysite.com/admin/asdasdasd/elmah.axd - 觸發認證
www.mysite.com/asdasdasd/admin/ elmah.axd - 找不到資源。 (正是我們想要的)

回答

70

我玩過web.config並得到以下工作。基本上,不要將elmah.axd HttpHandler放入常規system.web中,而是將其專門添加到「admin」路徑位置的system.web中。

<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

如果您使用的是asp.net mvc,請不要忘記添加: routes.IgnoreRoute(「admin/elmah.axd/{* pathInfo}」); – santiagoIT 2011-08-30 02:51:01

+0

有關安全和*** ELMAH ***的問題:http://geeks.ms/lruiz/2014/07/21/asp-net-revisa-la-configuracin-de-elmah-en-produccin/ – 2016-06-25 10:11:46

1

在IIS 7.5 windows server 2008中,有另一個名爲system.webServer的部分。 爲了ELMAH工作,這不得不說:

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

我已經嘗試了一些變化,但我無法使用上述解決方案,以防止 從「/blah/elmah.axd」加工。

任何關於使上述解決方案適用於IIS 7.x的建議?

謝謝。

+0

一旦我從system.web的httpHandlers部分和system.webserver下的處理程序中刪除了elmah.axd,現在我得到了404錯誤。 我有我的位置路徑=「管理員」就像艾倫建議的。 運行IIS 7.5。 – InvisibleMan1002 2010-08-12 20:06:53

+0

@Dan Atkinson這是一個不準確的陳述。如果您在IIS 7 +中託管,則必須在'system.webServer'配置部分中註冊HttpHandlers和HttpModules。 – 2011-04-02 01:25:36

+0

@ChrisMarisic:你知道,你是對的!我已收回(刪除)我先前的發言。謝謝你糾正我。 :) – 2011-04-02 10:54:29

25

如果您使用的是ASP.NET MVC,則需要讓路由引擎忽略該路徑。如果要移動到ELMAH爲/admin/elmah.axd比如,你應該添加以下的Global.asax.cs:

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

這解決了我在MVC上的問題,但我想原來的問題不是關於ASP.NET MVC。 – pauloya 2011-02-05 18:19:16

+0

+1用於指定MVC特定修復。在MVC3中爲我工作。沒有它@艾倫的答案將無法在MVC中工作。 – N30 2011-05-13 21:34:58

+0

@Paulo,問題沒有指定Webforms或MVC。 ASP.NET是兩者的基礎,所以包含了MVC所需的額外位。 – aarondcoleman 2012-08-17 01:09:03

17

在花了一段時間試圖讓這個由各個位拼湊工作來自每個答案的建議,我已經提出了一個適用於所有類型IIS的完整解決方案。

下面是需要在每個你的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> 

如果你正在使用ASP。網絡MVC,在您的RegisterRoutes方法中添加

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