EnterpriseLibrary2.0HandsOnLab翻譯(8):異常應用程式塊(二)

技術小甜發表於2017-11-23
練習2:異常處理策略
通過本練習將學會使用異常處理應用程式塊的包裝策略,來處理一些帶有敏感資訊的異常。
 
第一步
開啟Puzzler2.sln 專案,預設的安裝路徑應該為C:Program FilesMicrosoft Enterprise Library January 2006labscsException Handlingexercisesex02,並編譯。
 
第二步 保護服務中`Add Word`函式的程式碼訪問安全
1.在解決方案管理器選擇專案PuzzlerService中的Dictionary.cs檔案,選擇View | Code選單命令,為方法Add Word加上程式碼訪問安全特性。
None.gif// TODO: Add security attribute
None.gif

None.gif[PrincipalPermission(SecurityAction.Demand, Role 
= Grand PoohBah)]
None.gif
None.gif
public static Boolean AddWord(string wordToAdd)
None.gif
ExpandedBlockStart.gif
{
InBlock.gif
InBlock.gif    
if (!IsWord(wordToAdd))
InBlock.gif
ExpandedSubBlockStart.gif    
{
InBlock.gif
InBlock.gif        
// It is not alphabetic! Throw an exception
InBlock.gif

InBlock.gif        
throw new ApplicationException(
InBlock.gif
InBlock.gif            
Word to add does not consist of alphabetic letters);
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
if (Dict[wordToAdd] == null)
InBlock.gif
ExpandedSubBlockStart.gif    
{
InBlock.gif
InBlock.gif        Dict.Add(wordToAdd, wordToAdd);
InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
return true;
InBlock.gif
ExpandedBlockEnd.gif}
現在該方法只可以被角色Grand PoohBah所執行。注意要修改的方法在Dictionary.cs中而不是DictionaryService.cs
2.選擇Debug | Start Without Debugging選單命令執行應用程式。在Word to check文字框中輸入數字並單擊Add Word按鈕。這將會引發服務的AddWord方法丟擲一個SecurityException異常資訊,在事件檢視器中可以看到。
這裡SecurityException資訊從服務端傳到了客戶端,其中包含的資訊將會有助於攻擊者來攻破我們的系統安全。所以應該是在服務端記錄異常資訊,而只傳送很少的資訊到客戶端。
3.關閉應用程式。
 
第三步 配置應用程式包裝SecurityExceptions
1.在解決方案管理器中選中App.config檔案,在View選單或者在右鍵選單中選擇Open With…,將開啟OpenWith對話方塊,選中Enterprise Library Configuration並單擊OK按鈕。
App.config已經包含了一個空的策略Service Policy,預設的,如果一個策略是空的,異常資訊將會從Catch塊中重新丟擲,事實上該策略並沒有做任何事情。
2.選中Service Policy節點,選擇Action | New | Exception Type選單命令。在彈出的對話方塊中選擇System.Security.SecurityException,並單擊OK按鈕。
3.選中Service Policy | SecurityException節點,並設定如下屬性。
PostHandlingAction = ThrowNewException
4.新增新的Logging Handler,選中Service Policy | SecurityException節點,並選擇Action | New | Logging Handler選單命令,設定如下屬性。
FormatterType = TextExceptionFormatter,
LogCategory = General
Title = Security Exception in Service Layer
5.新增新的Replace Handler,選中Service Policy | SecurityException節點,選擇Action | New | Replace Handler選單命令,並設定如下屬性。
ExceptionMessage = Unauthorized Access
ReplaceExceptionType = System.Security.SecurityException (from mscorlib)
 
第四步 發生安全異常時退出應用程式
1.選中UI Policy節點,選擇Action | New | Exception Type選單命令,選擇System.Security.SecurityException型別並單擊OK按鈕,設定如下屬性。
PostHandlingAction = NotifyRethrow
處理行為NotifyRethrow將引發Application.ThreadException重新丟擲異常,重新丟擲的異常將會為一個未處理異常unhandled exception
2.為SecurityExceptionUI Policy策略下面新增新的Logging Handler,選擇Action | New | Logging Handler選單命令,設定如下屬性。
FormatterType = TextExceptionFormatter,
LogCategory = General
Title = Security Exception in UI Layer
3.儲存應用程式配置並關閉Enterprise Library Configuration工具。
 
第五步 測試包裝處理
選擇Debug | Start Without Debugging執行應用程式,在Word to check文字框中輸入數字並單擊Add Word按鈕。如果單擊Continue將會出現“Unhandled exception”異常資訊,這時不會再出現安全異常資訊,可以開啟事件檢視器檢視相關的日誌記錄情況。
在這裡事件日誌將會記錄三次異常,第一次是由服務層引發的Service Policy所記錄的異常,這是記錄在服務端的;第二次是Application ThreadException引發的UI Policy所記錄的異常,它是記錄在客戶端,由於這裡服務端和客戶端使用的是同一個機器;第三次是AppDomain UnhandledException引發的Unhandled Policy記錄的異常。
 
注意根據Hands On Lab給出的時間建議,做完以上兩個練習的時間應該為30分鐘。
 
更多Enterprise Library的文章請參考《Enterprise Library系列文章
















本文轉自lihuijun51CTO部落格,原文連結:http://blog.51cto.com/terrylee/67639 ,如需轉載請自行聯絡原作者


相關文章