[WCF權(quán)限控制]WCF的三種授權(quán)模式
前面的兩篇文章(《從兩個重要的概念談起:Identity與Principal[上篇]》和《從兩個重要的概念談起:Identity與Principal[下篇]》)主要探討基于安全主體的授權(quán)。通過這些介紹我們知道:如果我們在實(shí)施授權(quán)的時候,當(dāng)前線程的安全主體能夠被正確設(shè)置,我們就可以正確地完成授權(quán)。基于相同的原理,對于WCF的服務(wù)授權(quán),如果正確的安全主體能夠在服務(wù)操作被執(zhí)行之前被正確設(shè)置到當(dāng)前線程,借助于這個安全主體,我們不但可以采用命令式編程的方式將授權(quán)邏輯寫在相應(yīng)的操作中,也可以采用聲明式編程的方式將授權(quán)策略定義在應(yīng)用在服務(wù)操作方法上的PrincipalPermissionAttribute特性中。
目錄:
一、三種授權(quán)模式
二、RoleProviderPrincipal
三、ServiceAuthorizationBehavior
一、三種授權(quán)模式
安全主體具有兩個基本的要素:身份與權(quán)限。身份在客戶端經(jīng)過認(rèn)證之后已經(jīng)確立下來,現(xiàn)在需要解決的問題就是如何獲取被認(rèn)證用戶的權(quán)限。為了解決這個問題,WCF為我們提供了不同的方案,我們把這些方案成為不同的“安全主體權(quán)限模式(Principal Permission Mode)”。具體來說,WCF支持如下三種安全主體權(quán)限模式。
- 采用Windows用戶組:將經(jīng)過認(rèn)證的用戶映射為同名的Windows帳號,將該帳號所在的用戶組作為權(quán)限集;
- 采用ASP.NET Roles提供程序:通過ASP.NET角色管理機(jī)制借助于某個RoleProvider獲取基于當(dāng)前認(rèn)證用戶的角色列表,并將其作為權(quán)限集;
- 自定義權(quán)限模式:自定義權(quán)限解析和安全主體創(chuàng)建機(jī)制。
在WCF關(guān)于安全應(yīng)用編程接口中,安全主體權(quán)限模式通過System.ServiceModel.Description.PrincipalPermissionMode枚舉表示。下面的代碼片斷表示PrincipalPermissionMode的定義。
1: public enum PrincipalPermissionMode
2: {
3: None,
4: UseWindowsGroups,
5: UseAspNetRoles,
6: Custom
7: }
采用的安全主體權(quán)限模式?jīng)Q定了最終生成的安全主體的類型。之前我們介紹了WindowsPrincipal和GenericPrincoipal,而UseAspNetRoles模式對應(yīng)的是另一種安全主體類型:RoleProviderPrincipal。
二、RoleProviderPrincipal
RoleProviderPrincipal定義在System.ServiceModel.Security命名空間下。RoleProviderPrincipal顧名思義,就是基于ASP.NET RoleProvider授權(quán)模式下產(chǎn)生的安全主體。和X509Identity一樣,RoleProviderPrincipal僅僅是定義在System.ServiceModel程序集中的一個內(nèi)部類型而已。下面的代碼片斷體現(xiàn)了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: }
三、ServiceAuthorizationBehavior
在運(yùn)行時,WCF的服務(wù)端框架根據(jù)當(dāng)前DispatchRuntime的PrincipalPermissionMode屬性判斷具體采用哪種安全主體權(quán)限模式。如果采用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的上述兩個屬性最終是通過一個特殊的服務(wù)行為進(jìn)行設(shè)置的,該服務(wù)行為的類型為ServiceAuthorizationBehavior。從下面的代碼片斷中可以看到PrincipalPermissionMode和RoleProvider兩屬性依然定義在ServiceAuthorizationBehavior中。定義在ServiceAuthorizationBehavior中的授權(quán)相關(guān)的設(shè)置最終通過ApplyDispatchBehavior方法被應(yīng)用到所有終結(jié)點(diǎn)分發(fā)器(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: }


前面的兩篇文章主要探討基于安全主體的授權(quán)。通過這些介紹我們知道:如果我們在實(shí)施授權(quán)的時候,當(dāng)前線程的安全主體能夠被正確設(shè)置,我們就可以正確地完成授權(quán)。安全主體具有兩個基本的要素:身份與權(quán)限。身份在客戶端經(jīng)過認(rèn)證之后已經(jīng)確立下來,現(xiàn)在需要解決的問題就是如何獲取被認(rèn)證用戶的權(quán)限。為了解決這個問題,WCF為我們提供了三種不同的方案。
浙公網(wǎng)安備 33010602011771號