模擬在WCF中的應(yīng)用
在《模擬(Impersonation)與委托(Delegation)》一文中,我們對模擬和委托這兩個概念以及相關(guān)編程實現(xiàn)進(jìn)行了詳細(xì)說明。如果將模擬使用在WCF上面,就意味著WCF可以模擬客戶端身份(而不是啟動寄宿進(jìn)程的Windows帳號)執(zhí)行服務(wù)操作。這篇文章主要介紹WCF關(guān)于模擬的編程。
一、命令式模擬編程
如果我們有一個具有模擬級別為Impersonation或者Delegation的WindowsIdentity,我們就可以通過調(diào)用其Impersonate對其進(jìn)行身份模擬。在采用WCF認(rèn)證的情況下,我們可以通過當(dāng)前ServiceSecurityContext的WindowsIdentity或者PrimaryIdentity獲取到代碼認(rèn)證客戶端的WindowsIdentity對象,那么在服務(wù)操作中模擬客戶端身份就和簡單了。這種在服務(wù)操作實現(xiàn)中通過編程的方式實現(xiàn)身份模式可以將服務(wù)操作的部分邏輯在模擬的客戶端身份下執(zhí)行。
1: using (WindowsImpersonationContext context = ServiceSecurityContext.Current.WindowsIdentity.Impersonate())
2: {
3: //在模擬上下文中執(zhí)行的操作
4: }
二、聲明式模擬編程
如果你希望整個操作都在模擬上下文中執(zhí)行,你可以采用聲明式的模擬編程。具體來說,你只需要在需要進(jìn)行模擬的服務(wù)操作方法上應(yīng)用OperationBehaviorAttribute特性,并指定相應(yīng)的模擬選項即可。
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:不允許模擬客戶端身份,這是默認(rèn)值;
- Allowed:在身份模擬條件滿足條件允許模擬客戶端身份;
- Required:強(qiáng)制模擬客戶端身份。這要求強(qiáng)制采用Windows認(rèn)證,如果采用非Windows認(rèn)證,會拋出異常。
此外,如果你要求服務(wù)的所有操作均強(qiáng)制采用身份模擬,你可以通過編程或者配置將ServiceAuthorizationBehavior的ImpersonateCallerForAllOperations屬性設(shè)置成true。但是在這種情況下,如果該服務(wù)具有任何模擬選項被設(shè)置成NotAllowed的服務(wù)操作,服務(wù)在寄宿過程中會拋出InvalidationOperationException異常。
1: public sealed class ServiceAuthorizationBehavior : IServiceBehavior
2: {
3: //其他成員
4: public bool ImpersonateCallerForAllOperations { get; set; }
5: }
三、設(shè)置模擬級別
在采用Windows認(rèn)證的情況下,服務(wù)可以在成功認(rèn)證后可以獲取代表客戶端身份的WindowsIdentity對象。但是服務(wù)端是否可以根據(jù)WindowsIdentity獲取客戶端身份信息,是否可以模擬客戶端身份訪問某些安全資源,這取決于該WindowsIdentity的模擬級別。
身份模擬密切地關(guān)系到被模擬身份代表的用戶的安全,所以模擬級別應(yīng)該通過客戶端自行控制。在WCF安全體系中,該模擬級別是在客戶端提供的Windows憑證中指定。如下面的代碼所示,表示客戶端Windows憑證的WindowsClientCredential類型中,具有一個類型為TokenImpersonationLevel枚舉的AllowedImpersonationLevel屬性,用以指定模擬級別。該屬性的默認(rèn)值為None,實際上代表的等級是Identification。
1: public sealed class WindowsClientCredential
2: {
3: //其他成員
4: public TokenImpersonationLevel AllowedImpersonationLevel { get; set; }
5: }


在《模擬(Impersonation)與委托(Delegation)》一文中,我們對模擬和委托這兩個概念以及相關(guān)編程實現(xiàn)進(jìn)行了詳細(xì)說明。如果將模擬使用在WCF上面,就意味著WCF可以模擬客戶端身份(而不是啟動寄宿進(jìn)程的Windows帳號)執(zhí)行服務(wù)操作。這篇文章主要介紹WCF關(guān)于模擬的編程。
浙公網(wǎng)安備 33010602011771號