﻿# 如何替 ELMAH 錯誤紀錄頁面加上 IP 來源限制存取設定 (IIS)

[ELMAH](https://code.google.com/p/elmah/) (Error Logging Modules and Handlers) 專門用來紀錄 ASP.NET 網站執行時期的錯誤，對維護網站軟體品質來說有很大的幫助。不過 ELMAH 記錄的資訊過於詳細，一般來說我們都還是會設定各種存取限制，例如透過限定使用者或角色的方式。本篇文章我將說明如何透過 IIS7 / IIS8 內建的 [IP Security](http://www.iis.net/configreference/system.webserver/security/ipsecurity) 模組，來限制特定 IP 來源才能存取 ELMAH 錯誤紀錄頁面。

首先，如果你的 IIS 是 Windows 7 或 Windows Server 2008 以上版本，必須先安裝 IIS 的 **IP 安全性** 功能，以確保你可以正確使用限制 IP 存取的功能設定。如果是 IISExpress 則不用特別設定，預設就已經內建了。

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/73007bbdb37bc9ecb23e-image_2497.png)

如果有安裝成功，你會在 IIS 管理員中看見 **IP 位址及網域限制** 功能：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/0c4b3a82dbd051f9836d-SNAGHTML4e0832.png)

由於 ELMAH 執行的時候，其 URL 不是固定的，他是一個 HttpHandler，所以可以透過 web.config 任意修改網址 ( 預設網址為 elmah.axd )。不過，我們若要在 IIS 管理員中設定 IP 安全性，只能針對**實體資料夾**進行設定，因此若要將設定套用在 ELMAH 的 URL 勢必要用手動設定。

不過，我們可以先藉由 IIS 管理員的 GUI 介面幫我們設定好，最後在手動調整網址即可，請參考以下步驟進行設定，這裡我們直接以上圖 aspnet\_client 資料夾做為測試範例。

1\. 先編輯功能設定，我們要先將該資料夾位址設定為「預設拒絕存取」

    ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/ebb4aef8240441cd1730-image_2498.png)

    ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/57c167d0f4b34eb31e9b-image_2499.png)

2\. 然後新增允許項目，讓特定 IP 來源才能存取該位址

    ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/4f6627df5190b65b8f48-image_2500.png)

    ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/beaf1ef4226d7de5b530-image_2501.png)

新增完成後如下範例：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/1a1c7c044fc9f6f676d8-SNAGHTML5a47b1.png)

3\. 接著我們來查看這個設定到底儲存在哪裡。

由於 IIS 的 IP 安全性 ( IP Security ) 模組預設只能被定義在伺服器層級的 applicationHost.config 設定檔中，所以你透過 IIS 管理員所做出的設定，都會儲存在這個檔案中，而非網站根目錄或 aspnet\_client 目錄下的 web.config 裡。以下為 applicationHost.config 設定檔的實體路徑：

-   IIS7 / IIS8： "**C:\\Windows\\System32\\inetsrv\\config\\applicationHost.config**"
-   IISExpress： "**%USERPROFILE%\\Documents\\IISExpress\\config\\applicationhost.config**"

開啟該設定檔後，直接跳至檔案最下方，就會看到這個設定：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/2536d018f36dae9a5ca5-image_2502.png)

如果你最後要完成設定，只要將 <location> 的 path 屬性修改一下即可，請參考如下圖箭頭處：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/7edf718e3f62556ca13f-image_2503.png)

設定的文字檔內容如下：

```xml
<location path="Default Web Site/elmah.axd" overrideMode="Allow">
    <system.webServer>
        <security>
            <ipSecurity allowUnlisted="false">
                <add ipAddress="127.0.0.1" allowed="true" />
            </ipSecurity>
        </security>
    </system.webServer>
</location>
```

  
  
不過，這樣的設定由於每次調整都要動到系統資料夾下的 applicationHost.config 設定檔，對網站部署來說，其實蠻不好管理的，如果可以的話，最好是可以讓設定直接保存在網站目錄下的 web.config 之中，如此一來 IP 安全性設定就可以直接在網站資料夾中做設定，也可以跟專案一起做好版本控管。

如果你想將 <ipSecurity> 區段設定在 web.config 之中，那麼你勢必要先調整 applicationHost.config 設定檔，允許 web.config 可以覆蓋 applicationHost.config 設定檔中的 <ipSecurity> 定義。

請先用**系統管理員**權限開啟 applicationHost.config 設定檔：

-   IIS7 / IIS8： "**C:\\Windows\\System32\\inetsrv\\config\\applicationHost.config**"
-   IISExpress： "**%USERPROFILE%\\Documents\\IISExpress\\config\\applicationhost.config**"

然後找到 configuration/configSections/sectionGroup\[name="system.webServer"\]/sectionGroup\[name="security"\] 區段，並且找到以下這行： （或搜尋 ipSecurity 關鍵字也可以快速找到）

    <section name="ipSecurity" overrideModeDefault="**Deny**" />

並請修改成如下設定，然後儲存檔案：

    <section name="ipSecurity" overrideModeDefault="Allow" />

如此一來便設定完成！

  
  
以下是一個 ELMAH 的設定檔範例，其中包括 ipSecurity 設定：

```xml
<location path="elmah.axd" inheritInChildApplications="false">
  <system.web>
    <httpHandlers>
      <add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
    </httpHandlers>
    <!--
      See http://code.google.com/p/elmah/wiki/SecuringErrorLogPages for
      more information on using ASP.NET authorization securing ELMAH.

    <authorization>
      <allow roles="admin" />
      <deny users="*" />
    </authorization>
    -->
  </system.web>
  <system.webServer>
    <handlers>
      <add name="ELMAH" verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" preCondition="integratedMode" />
    </handlers>
    <security>
      <ipSecurity allowUnlisted="false">
        <add ipAddress="127.0.0.1" subnetMask="8" allowed="true" />
        <add ipAddress="192.168.1.0" subnetMask="24" allowed="true" />
        <add ipAddress="12.34.56.78" subnetMask="32" allowed="true" />
      </ipSecurity>
    </security>
  </system.webServer>
</location>
```

  
  
**相關連結**

-   [SecuringErrorLogPages – elmah](https://code.google.com/p/elmah/wiki/SecuringErrorLogPages)
-   [elmah - Error Logging Modules and Handlers for ASP.NET](https://code.google.com/p/elmah/)
-   [IP Security <ipSecurity> : The Official Microsoft IIS Site](http://www.iis.net/configreference/system.webserver/security/ipsecurity)
