上一篇文章「ASP.NET MVC + ELMAH 監控並記錄你的網站錯誤資訊 1」有遇到一個問題,那就是原先ELMAH所預設的設定會讓任何人都可以看到ELMAH記錄,對於網路的安全性就有極大的危險,因為錯誤記錄都記錄了許多的資訊,除了客戶資訊外也包含了Server的環境資訊,甚至於錯誤的程式碼位置'、輸入的機密資料等,怎麼可以讓任何人說進來就進來呢?
所以有些安全性的設定還是要記得去修改、去設定,免得讓有心人竊取資料或是毀損資料。
一般來說,ELMAH要去增加安全設定,不讓任何閒雜人等擅闖,就要修改Web.Config的設定,如下:
<elmah><errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="~/App_Data/Elmah.Errors" /><security allowRemoteAccess="yes" /></elmah><location path="elmah.axd"><system.web><authorization><allow roles="Admin"/><deny users="*"/></authorization></system.web></location>
但是ELMAH.MVC就不需要,因為已經把權限設定的地方改在Controller中,使用AuthorizeAttribute,
預設的程式中,是預設把Controller上的AuthorizeAttribute給註解起來,
而我們只要把這個這解給移除就可以,
這時候要是我們直接進入~/Admin/Elmah的話,就會被導到登入頁面
不過這也要你事先把登入頁面(AccountController / LogOn)給做好,另外在Web.Config有設定(預設都會設定)
<authentication mode="Forms"><forms loginUrl="~/Account/LogOn" timeout="2880" /></authentication>
這邊我是透過Forms Authentication來處理登入的權限認證,在Global.asax中增加Application_AuthenticateRequest()方法
/// <summary>
/// Handles the AuthenticateRequest event of the Application control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
protected void Application_AuthenticateRequest(Object sender, EventArgs e){bool hasUser = HttpContext.Current.User != null;bool isAuthenticated = hasUser && HttpContext.Current.User.Identity.IsAuthenticated;
bool isIdentity = isAuthenticated && HttpContext.Current.User.Identity is FormsIdentity;if (isIdentity)
{// 取得表單認證目前這位使用者的身份
FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;// 取得 FormsAuthenticationTicket 物件
FormsAuthenticationTicket ticket = id.Ticket;// 取得 UserData 欄位資料 (這裡我們儲存的是角色)
string userData = ticket.UserData;
// 如果有多個角色可以用逗號分隔
string[] roles = userData.Split(',');
// 賦予該使用者新的身份 (含角色資訊)
HttpContext.Current.User = new GenericPrincipal(id, roles);
}}
而至於Forms Authentication的運作與登入機制的實作,可以在網路上找一下,這邊就不另做說明,
可以參考一下以下幾篇文章:
Demo - ASP.NET MVC 無法正常登出的解決方式
好的,當網站的登入機制完成後,要看ELMAH記錄就可以藉由登入完成後得以瀏覽了。
不過呢……因為ELMAH.MVC預設在ASP.NET MVC網站裡是去建立一個Area,預設名稱是「Admin」,但是這個名稱太好猜了,先不論有心者要怎麼去猜目錄名稱以及怎麼猜網站有沒有用Elmah,總之「Admin」這個名稱太容易被猜中了,所以咧~最好的方式就是改個名稱,以降低被猜中的機率。
例如,我把原本的「Admin」改為「ErrorAdmin」,
如果還是從原來的「~/Admin/Elmah」進入的話,就會給你一個404錯誤頁面,
而如果從已經更改的「~/ErrorAdmin/Elmah」進入的話,就可以導到登入頁面或是進入到Elmah頁面,
總之,防人之心不可無,甚至我是認為我都不太想讓客戶知道怎麼進去看Elmah記錄,除了安全性問題外,最要緊的是,不太想要讓客戶看到Elmah記錄中一堆的錯誤記錄,以免被認為程式中有一堆的BUG,大家也知道,客戶……如果知道分辨什麼是錯誤、什麼是BUG、什麼是例外的話,那就不是客戶了…
延伸閱讀:
Demo - 如何偵錯--ELMAH 絕妙的偵錯工具安全架設於ASP.NET MVC
黑暗執行绪 - ASP.NET保安系列 - 關於elmah.axd的安全設定
Pete.NET - 好用的error logging framework - ELMAH
RiCo技術農場 - [C#][ASP.NET MVC]ELMAH On IIS7.5
以上
我也用了這個,確實好用!
回覆刪除D神別鬧了,用這個算是開發網站的基本要件...
回覆刪除