[WCF權限控製]WCF的三種授權模式
前麵的兩篇文章(《從兩個重要的概念談起:Identity與Principal[上篇]》和《從兩個重要的概念談起:Identity與Principal[下篇]》)主要探討基於安全主體的授權。通過這些介紹我們知道:如果我們在實施授權的時候,當前線程的安全主體能夠被正確設置,我們就可以正確地完成授權。基於相同的原理,對於WCF的服務授權,如果正確的安全主體能夠在服務操作被執行之前被正確設置到當前線程,借助於這個安全主體,我們不但可以采用命令式編程的方式將授權邏輯寫在相應的操作中,也可以采用聲明式編程的方式將授權策略定義在應用在服務操作方法上的PrincipalPermissionAttribute特性中。
目錄:
一、三種授權模式
二、RoleProviderPrincipal
三、ServiceAuthorizationBehavior
安全主體具有兩個基本的要素:身份與權限。身份在客戶端經過認證之後已經確立下來,現在需要解決的問題就是如何獲取被認證用戶的權限。為了解決這個問題,WCF為我們提供了不同的方案,我們把這些方案成為不同的“安全主體權限模式(Principal Permission Mode)”。具體來說,WCF支持如下三種安全主體權限模式。
- 采用Windows用戶組:將經過認證的用戶映射為同名的Windows帳號,將該帳號所在的用戶組作為權限集;
- 采用ASP.NET Roles提供程序:通過ASP.NET角色管理機製借助於某個RoleProvider獲取基於當前認證用戶的角色列表,並將其作為權限集;
- 自定義權限模式:自定義權限解析和安全主體創建機製。
在WCF關於安全應用編程接口中,安全主體權限模式通過System.ServiceModel.Description.PrincipalPermissionMode枚舉表示。下麵的代碼片斷表示PrincipalPermissionMode的定義。
1: public enum PrincipalPermissionMode
2: {
3: None,
4: UseWindowsGroups,
5: UseAspNetRoles,
6: Custom
7: }
采用的安全主體權限模式決定了最終生成的安全主體的類型。之前我們介紹了WindowsPrincipal和GenericPrincoipal,而UseAspNetRoles模式對應的是另一種安全主體類型:RoleProviderPrincipal。
RoleProviderPrincipal定義在System.ServiceModel.Security命名空間下。RoleProviderPrincipal顧名思義,就是基於ASP.NET RoleProvider授權模式下產生的安全主體。和X509Identity一樣,RoleProviderPrincipal僅僅是定義在System.ServiceModel程序集中的一個內部類型而已。下麵的代碼片斷體現了RoleProviderPrincipal的定義。
1: internal sealed class RoleProviderPrincipal : IPrincipal
2: {
3: public RoleProviderPrincipal(object roleProvider, ServiceSecurityContext securityContext);
4: public bool IsInRole(string role);
5: public IIdentity Identity { get; }
6: }
在運行時,WCF的服務端框架根據當前DispatchRuntime的PrincipalPermissionMode屬性判斷具體采用哪種安全主體權限模式。如果采用UseAspNetRoles模式,通過RoleProvider屬性得到用於獲取角色列表的RoleProvider。PrincipalPermissionMode和RoleProvider在DispatchRuntime中的定義如下所示。
1: public sealed class DispatchRuntime
2: {
3: //其他成員
4: public PrincipalPermissionMode PrincipalPermissionMode { get; set; }
5: public RoleProvider RoleProvider { get; set; }
6: }
而DispatchRuntime的上述兩個屬性最終是通過一個特殊的服務行為進行設置的,該服務行為的類型為ServiceAuthorizationBehavior。從下麵的代碼片斷中可以看到PrincipalPermissionMode和RoleProvider兩屬性依然定義在ServiceAuthorizationBehavior中。定義在ServiceAuthorizationBehavior中的授權相關的設置最終通過ApplyDispatchBehavior方法被應用到所有終結點分發器(EndpointDispatcher)的DispatchRuntime上。
1: public sealed class ServiceAuthorizationBehavior : IServiceBehavior
2: {
3: //其他成員
4: void IServiceBehavior.AddBindingParameters(ServiceDescription description, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection parameters);
5: void IServiceBehavior.ApplyDispatchBehavior(ServiceDescription description, ServiceHostBase serviceHostBase);
6: void IServiceBehavior.Validate(ServiceDescription description, ServiceHostBase serviceHostBase);
7:
8: public PrincipalPermissionMode PrincipalPermissionMode { get; set; }
9: public RoleProvider RoleProvider { get; set; }
10: }
微信公眾賬號:大內老A
微博:www.weibo.com/artech
如果你想及時得到個人撰寫文章以及著作的消息推送,或者想看看個人推薦的技術資料,可以掃描左邊二維碼(或者長按識別二維碼)關注個人公眾號(原來公眾帳號蔣金楠的自媒體將會停用)。
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁麵明顯位置給出原文連接,否則保留追究法律責任的權利。
最後更新:2017-10-26 16:34:11