Enterprise Library 2.0 Hands On Lab 翻譯(8):異常應(yīng)用程序塊(二)
練習(xí)2:異常處理策略
通過本練習(xí)將學(xué)會(huì)使用異常處理應(yīng)用程序塊的包裝策略,來處理一些帶有敏感信息的異常。
第一步
打開Puzzler2.sln 項(xiàng)目,默認(rèn)的安裝路徑應(yīng)該為C:\Program Files\Microsoft Enterprise Library January 2006\labs\cs\Exception Handling\exercises\ex02,并編譯。
第二步 保護(hù)服務(wù)中'Add Word'函數(shù)的代碼訪問安全
1.在解決方案管理器選擇項(xiàng)目PuzzlerService中的Dictionary.cs文件,選擇View | Code菜單命令,為方法Add Word加上代碼訪問安全特性。
// TODO: Add security attribute
[PrincipalPermission(SecurityAction.Demand, Role = "Grand PoohBah")]
public static Boolean AddWord(string wordToAdd)
{
if (!IsWord(wordToAdd))
{
// It is not alphabetic! Throw an exception
throw new ApplicationException(
"Word to add does not consist of alphabetic letters");
}
if (Dict[wordToAdd] == null)
{
Dict.Add(wordToAdd, wordToAdd);
}
return true;
}現(xiàn)在該方法只可以被角色Grand PoohBah所執(zhí)行。注意要修改的方法在Dictionary.cs中而不是DictionaryService.cs。
2.選擇Debug | Start Without Debugging菜單命令運(yùn)行應(yīng)用程序。在Word to check文本框中輸入數(shù)字并單擊Add Word按鈕。這將會(huì)引發(fā)服務(wù)的AddWord方法拋出一個(gè)SecurityException異常信息,在事件查看器中可以看到。

這里SecurityException信息從服務(wù)端傳到了客戶端,其中包含的信息將會(huì)有助于攻擊者來攻破我們的系統(tǒng)安全。所以應(yīng)該是在服務(wù)端記錄異常信息,而只發(fā)送很少的信息到客戶端。
3.關(guān)閉應(yīng)用程序。
第三步 配置應(yīng)用程序包裝SecurityExceptions
1.在解決方案管理器中選中App.config文件,在View菜單或者在右鍵菜單中選擇Open With…,將打開OpenWith對(duì)話框,選中Enterprise Library Configuration并單擊OK按鈕。
App.config已經(jīng)包含了一個(gè)空的策略Service Policy,默認(rèn)的,如果一個(gè)策略是空的,異常信息將會(huì)從Catch塊中重新拋出,事實(shí)上該策略并沒有做任何事情。
2.選中Service Policy節(jié)點(diǎn),選擇Action | New | Exception Type菜單命令。在彈出的對(duì)話框中選擇System.Security.SecurityException,并單擊OK按鈕。

3.選中Service Policy | SecurityException節(jié)點(diǎn),并設(shè)置如下屬性。
PostHandlingAction = ThrowNewException

4.添加新的Logging Handler,選中Service Policy | SecurityException節(jié)點(diǎn),并選擇Action | New | Logging Handler菜單命令,設(shè)置如下屬性。
FormatterType = TextExceptionFormatter,
LogCategory = General
Title = Security Exception in Service Layer

5.添加新的Replace Handler,選中Service Policy | SecurityException節(jié)點(diǎn),選擇Action | New | Replace Handler菜單命令,并設(shè)置如下屬性。
ExceptionMessage = Unauthorized Access
ReplaceExceptionType = System.Security.SecurityException (from mscorlib)

第四步 發(fā)生安全異常時(shí)退出應(yīng)用程序
1.選中UI Policy節(jié)點(diǎn),選擇Action | New | Exception Type菜單命令,選擇System.Security.SecurityException類型并單擊OK按鈕,設(shè)置如下屬性。
PostHandlingAction = NotifyRethrow

處理行為NotifyRethrow將引發(fā)Application.ThreadException重新拋出異常,重新拋出的異常將會(huì)為一個(gè)未處理異常unhandled exception。
2.為SecurityException在UI Policy策略下面添加新的Logging Handler,選擇Action | New | Logging Handler菜單命令,設(shè)置如下屬性。
FormatterType = TextExceptionFormatter,
LogCategory = General
Title = Security Exception in UI Layer

3.保存應(yīng)用程序配置并關(guān)閉Enterprise Library Configuration工具。
第五步 測(cè)試包裝處理
選擇Debug | Start Without Debugging運(yùn)行應(yīng)用程序,在Word to check文本框中輸入數(shù)字并單擊Add Word按鈕。如果單擊Continue將會(huì)出現(xiàn)“Unhandled exception”異常信息,這時(shí)不會(huì)再出現(xiàn)安全異常信息,可以打開事件查看器查看相關(guān)的日志記錄情況。
在這里事件日志將會(huì)記錄三次異常,第一次是由服務(wù)層引發(fā)的Service Policy所記錄的異常,這是記錄在服務(wù)端的;第二次是Application ThreadException引發(fā)的UI Policy所記錄的異常,它是記錄在客戶端,由于這里服務(wù)端和客戶端使用的是同一個(gè)機(jī)器;第三次是AppDomain UnhandledException引發(fā)的Unhandled Policy記錄的異常。
注意根據(jù)Hands On Lab給出的時(shí)間建議,做完以上兩個(gè)練習(xí)的時(shí)間應(yīng)該為30分鐘。
更多Enterprise Library的文章請(qǐng)參考《Enterprise Library系列文章》
Worktile,新一代簡(jiǎn)單好用、體驗(yàn)極致的團(tuán)隊(duì)協(xié)同、項(xiàng)目管理工具,讓你和你的團(tuán)隊(duì)隨時(shí)隨地一起工作。完全免費(fèi),現(xiàn)在就去了解一下吧。
https://worktile.com



浙公網(wǎng)安備 33010602011771號(hào)