模擬在WCF中的應用
在《模擬(Impersonation)與委托(Delegation)》一文中,我們對模擬和委托這兩個概念以及相關編程實現進行了詳細說明。如果將模擬使用在WCF上麵,就意味著WCF可以模擬客戶端身份(而不是啟動寄宿進程的Windows帳號)執行服務操作。這篇文章主要介紹WCF關於模擬的編程。
如果我們有一個具有模擬級別為Impersonation或者Delegation的WindowsIdentity,我們就可以通過調用其Impersonate對其進行身份模擬。在采用WCF認證的情況下,我們可以通過當前ServiceSecurityContext的WindowsIdentity或者PrimaryIdentity獲取到代碼認證客戶端的WindowsIdentity對象,那麼在服務操作中模擬客戶端身份就和簡單了。這種在服務操作實現中通過編程的方式實現身份模式可以將服務操作的部分邏輯在模擬的客戶端身份下執行。
1: using (WindowsImpersonationContext context = ServiceSecurityContext.Current.WindowsIdentity.Impersonate())
2: {
3: //在模擬上下文中執行的操作
4: }
如果你希望整個操作都在模擬上下文中執行,你可以采用聲明式的模擬編程。具體來說,你隻需要在需要進行模擬的服務操作方法上應用OperationBehaviorAttribute特性,並指定相應的模擬選項即可。
1: [AttributeUsage(AttributeTargets.Method)]
2: public sealed class OperationBehaviorAttribute : Attribute, IOperationBehavior
3: {
4: //其他成員
5: public ImpersonationOption Impersonation { get; set; }
6: }
7: public enum ImpersonationOption
8: {
9: NotAllowed,
10: Allowed,
11: Required
12: }
通過OperationBehaviorAttribute的Impersonation屬性指定模擬選項通過枚舉ImpersonationOption表示。定義在ImpersonationOption的三個枚舉項NotAllowed、Allowed和Required分別表示的含義如下。
- NotAllowed:不允許模擬客戶端身份,這是默認值;
- Allowed:在身份模擬條件滿足條件允許模擬客戶端身份;
- Required:強製模擬客戶端身份。這要求強製采用Windows認證,如果采用非Windows認證,會拋出異常。
此外,如果你要求服務的所有操作均強製采用身份模擬,你可以通過編程或者配置將ServiceAuthorizationBehavior的ImpersonateCallerForAllOperations屬性設置成true。但是在這種情況下,如果該服務具有任何模擬選項被設置成NotAllowed的服務操作,服務在寄宿過程中會拋出InvalidationOperationException異常。
1: public sealed class ServiceAuthorizationBehavior : IServiceBehavior
2: {
3: //其他成員
4: public bool ImpersonateCallerForAllOperations { get; set; }
5: }
在采用Windows認證的情況下,服務可以在成功認證後可以獲取代表客戶端身份的WindowsIdentity對象。但是服務端是否可以根據WindowsIdentity獲取客戶端身份信息,是否可以模擬客戶端身份訪問某些安全資源,這取決於該WindowsIdentity的模擬級別。
身份模擬密切地關係到被模擬身份代表的用戶的安全,所以模擬級別應該通過客戶端自行控製。在WCF安全體係中,該模擬級別是在客戶端提供的Windows憑證中指定。如下麵的代碼所示,表示客戶端Windows憑證的WindowsClientCredential類型中,具有一個類型為TokenImpersonationLevel枚舉的AllowedImpersonationLevel屬性,用以指定模擬級別。該屬性的默認值為None,實際上代表的等級是Identification。
1: public sealed class WindowsClientCredential
2: {
3: //其他成員
4: public TokenImpersonationLevel AllowedImpersonationLevel { get; set; }
5: }
微信公眾賬號:大內老A
微博:www.weibo.com/artech
如果你想及時得到個人撰寫文章以及著作的消息推送,或者想看看個人推薦的技術資料,可以掃描左邊二維碼(或者長按識別二維碼)關注個人公眾號(原來公眾帳號蔣金楠的自媒體將會停用)。
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁麵明顯位置給出原文連接,否則保留追究法律責任的權利。
最後更新:2017-10-26 16:04:58