[WCF權(quán)限控制]基于Windows用戶組的授權(quán)方式[上篇]
Windows用戶組安全主體權(quán)限模式,顧名思義,就是將利用Windows安全系統(tǒng)將對(duì)應(yīng)的Windows帳號(hào)所在的用戶組作為該用戶權(quán)限集的授權(quán)方式。認(rèn)證和授權(quán)密不可分,但是對(duì)于認(rèn)證和授權(quán)在WCF安全體系中的實(shí)現(xiàn)來說,它們則是相對(duì)獨(dú)立的。認(rèn)證屬于安全傳輸?shù)姆懂牐窃谛诺缹訉?shí)現(xiàn)的,而授權(quán)則是在服務(wù)模型層實(shí)現(xiàn)的。但是對(duì)于基于Windows用戶組的授權(quán)來說,最終體現(xiàn)出來的授權(quán)行為卻和采用何種認(rèn)證具有密切的關(guān)系。
一、Windows用戶組授權(quán)與認(rèn)證的關(guān)系
無論是對(duì)于基于Windows用戶組還是基于ASP.NET Roles提供程序的授權(quán),最終都體現(xiàn)在創(chuàng)建相應(yīng)的安全主體,并將其附加到當(dāng)前線程上。對(duì)于Windows用戶組模式來說,有一點(diǎn)是肯定的:不論采用何種客戶端憑證類型以及認(rèn)證模式,最終建立的安全主體都是一個(gè)WindowsPrincipal,并且這個(gè)WindowsPrincipal對(duì)應(yīng)的安全身份是一個(gè)WindowsIdentity。但是該WindowsPrincipal的Identity能否正確地反映被認(rèn)證后的用戶,以及其本身能夠正確反映該認(rèn)證用戶的權(quán)限,就和認(rèn)證有密切的關(guān)系。
具體來說,當(dāng)你選擇了Windows用戶組安全主體權(quán)限模式,只有在采用Windows認(rèn)證的情況下最終生成的安全主體才能正確地反映被認(rèn)證的用戶。這里的Windows認(rèn)證包括如下三種情況:
- 客戶端憑證為Windows憑證;
- 客戶端憑證為用戶名/密碼憑證,并采用Windows認(rèn)證模式;
- 客戶端憑證為X.509證書憑證,并允許與Windows帳號(hào)進(jìn)行映射。
在其他情況下,最終被創(chuàng)建的是一個(gè)“空”的WindowsPrincipal。這個(gè)空的WindowsPrincipal不僅僅體現(xiàn)在具有一個(gè)“空”的權(quán)限集,而且其內(nèi)部的WindowsIdentity也為“空”。該WindowsIdentity具有如下面列表所示的屬性。
- Name:空字符串
- AuthenticationType: 空字符串
- IsAuthenticated:False
- Groups:Null
- IsAnonymous:True
- IsGuest:False
- IsSystem:False
在非Windows認(rèn)證的情況下,即使存在著一個(gè)與認(rèn)證用戶一致的Windows帳號(hào),WCF授權(quán)系統(tǒng)都不會(huì)基于該Windows帳號(hào)來創(chuàng)建最終的WindowsPrincipal。舉個(gè)例子,假設(shè)服務(wù)寄宿端所在的域中具有一個(gè)用戶叫做“張三”,并且存在于當(dāng)前機(jī)器的管理員(Administrators)用戶組中。現(xiàn)在我們對(duì)某個(gè)服務(wù)操作進(jìn)行授權(quán),要求必須在具有管理員權(quán)限才能被調(diào)用。在進(jìn)行服務(wù)寄宿的時(shí)候,終結(jié)點(diǎn)的綁定采用用戶名/密碼作為客戶端憑證,并選擇Membership認(rèn)證模式。在認(rèn)證成功的情況下,被授權(quán)的服務(wù)操作也是不能被正常調(diào)用的。
通過前面一篇文章的介紹,我們知道了WCF采用怎樣的授權(quán)的方式通過ServiceAuthorizationBehavior這一服務(wù)行為來控制。所以針對(duì)授權(quán)的編程主要就體現(xiàn)在對(duì)該服務(wù)行為的設(shè)置。對(duì)于Windows用戶組授權(quán)來說,我們只需要將ServiceAuthorizationBehavior的PrincipalPermissionMode屬性設(shè)置成PrincipalPermissionMode.UseWindowsGroups即可。
二、ServiceAuthorizationBehavior服務(wù)行為的設(shè)置
既然ServiceAuthorizationBehavior是一個(gè)服務(wù)行為,我們只需要通過編程或者配置的方式將該服務(wù)行為添加到當(dāng)前服務(wù)的行為列表中就可以了。你可以按照下面的編程方式讓寄宿的服務(wù)采用基于Windows用戶組授權(quán)模式。
1: using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))
2: {
3: ServiceAuthorizationBehavior behavior = host.Description.Behaviors.Find<ServiceAuthorizationBehavior>();
4: if (null == behavior)
5: {
6: behavior = new ServiceAuthorizationBehavior();
7: host.Description.Behaviors.Add(behavior);
8: }
9: behavior.PrincipalPermissionMode = PrincipalPermissionMode.UseWindowsGroups;
10: host.Open();
11: //...
12: }
此外在ServiceHost你也可以通過ServiceHost的只讀屬性Authorization得到這個(gè)ServiceAuthorizationBehavior對(duì)象。如下面的代碼片斷所示,該屬性實(shí)際上是定義在ServiceHost的基類ServiceHostBase中。
1: public abstract class ServiceHostBase
2: {
3: //其他成員
4: public ServiceAuthorizationBehavior Authorization { get; }
5: }
在讀取該屬性的時(shí)候,如果當(dāng)前服務(wù)描述中的服務(wù)行為列表中找不到ServiceAuthorizationBehavior,系統(tǒng)會(huì)自動(dòng)創(chuàng)建一個(gè)ServiceAuthorizationBehavior對(duì)象并添加到服務(wù)行為列表中。所以對(duì)于上面的這段服務(wù)寄宿代碼實(shí)際和下面是完全等效的。
1: using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))
2: {
3: host.Authorization.PrincipalPermissionMode = PrincipalPermissionMode.UseWindowsGroups;
4: host.Open();
5: //...
6: }
我們依然推薦采用配置的方式進(jìn)行授權(quán)模式的設(shè)置。而下面一段配置和上面的代碼在作用上是等效的。
1: <configuration>
2: <system.serviceModel>
3: <services>
4: <service name="Artech.WcfServices.Services.CalculatorService" behaviorConfiguration="UseWindowsGroupsAuthorization">
5: <endpoint address="http://127.0.0.1/calculatorservice" binding="ws2007HttpBinding" contract="Artech.WcfServices.Contracts.ICalculator"/>
6: </service>
7: </services>
8: <behaviors>
9: <serviceBehaviors>
10: <behavior name="UseWindowsGroupsAuthorization">
11: <serviceAuthorization principalPermissionMode="UseWindowsGroups"/>
12: </behavior>
13: </serviceBehaviors>
14: </behaviors>
15: </system.serviceModel>
16: </configuration>
為了讓讀者對(duì)基于Windows用戶組的授權(quán)具有深刻的認(rèn)識(shí),在《下篇》中我們通過一個(gè)簡單的事例來講解在真正的應(yīng)用中該授權(quán)模式如何使用。
[WCF權(quán)限控制]基于Windows用戶組的授權(quán)方式[上篇]
[WCF權(quán)限控制]基于Windows用戶組的授權(quán)方式[下篇]


Windows用戶組安全主體權(quán)限模式,顧名思義,就是將利用Windows安全系統(tǒng)將對(duì)應(yīng)的Windows帳號(hào)所在的用戶組作為該用戶權(quán)限集的授權(quán)方式。認(rèn)證和授權(quán)密不可分,但是對(duì)于認(rèn)證和授權(quán)在WCF安全體系中的實(shí)現(xiàn)來說,它們則是相對(duì)獨(dú)立的。認(rèn)證屬于安全傳輸?shù)姆懂牐窃谛诺缹訉?shí)現(xiàn)的,而授權(quán)則是在服務(wù)模型層實(shí)現(xiàn)的。但是對(duì)于基于Windows用戶組的授權(quán)來說,最終體現(xiàn)出來的授權(quán)行為卻和采用何種認(rèn)證具有密切的關(guān)系。
浙公網(wǎng)安備 33010602011771號(hào)