閱讀463 返回首頁    go 阿裏雲 go 技術社區[雲棲]


[WCF權限控製]基於Windows用戶組的授權方式[上篇]

Windows用戶組安全主體權限模式,顧名思義,就是將利用Windows安全係統將對應的Windows帳號所在的用戶組作為該用戶權限集的授權方式。認證和授權密不可分,但是對於認證和授權在WCF安全體係中的實現來說,它們則是相對獨立的。認證屬於安全傳輸的範疇,是在信道層實現的,而授權則是在服務模型層實現的。但是對於基於Windows用戶組的授權來說,最終體現出來的授權行為卻和采用何種認證具有密切的關係。

無論是對於基於Windows用戶組還是基於ASP.NET Roles提供程序的授權,最終都體現在創建相應的安全主體,並將其附加到當前線程上。對於Windows用戶組模式來說,有一點是肯定的:不論采用何種客戶端憑證類型以及認證模式,。但是該WindowsPrincipal的Identity能否正確地反映被認證後的用戶,以及其本身能夠正確反映該認證用戶的權限,就和認證有密切的關係。

具體來說,。這裏的Windows認證包括如下三種情況:

  • 客戶端憑證為Windows憑證;
  • 客戶端憑證為用戶名/密碼憑證,並采用Windows認證模式;
  • 客戶端憑證為X.509證書憑證,並允許與Windows帳號進行映射。

。這個空的WindowsPrincipal不僅僅體現在具有一個“空”的權限集,而且其內部的WindowsIdentity也為“空”。該WindowsIdentity具有如下麵列表所示的屬性。

  • Name:空字符串
  • AuthenticationType: 空字符串
  • IsAuthenticated:False
  • Groups:Null
  • IsAnonymous:True
  • IsGuest:False
  • IsSystem:False

。舉個例子,假設服務寄宿端所在的域中具有一個用戶叫做“張三”,並且存在於當前機器的管理員(Administrators)用戶組中。現在我們對某個服務操作進行授權,要求必須在具有管理員權限才能被調用。在進行服務寄宿的時候,終結點的綁定采用用戶名/密碼作為客戶端憑證,並選擇Membership認證模式。在認證成功的情況下,被授權的服務操作也是不能被正常調用的。

通過前麵一篇文章的介紹,我們知道了WCF采用怎樣的授權的方式通過ServiceAuthorizationBehavior這一服務行為來控製。所以針對授權的編程主要就體現在對該服務行為的設置。對於Windows用戶組授權來說,我們隻需要將ServiceAuthorizationBehavior的PrincipalPermissionMode屬性設置成PrincipalPermissionMode.UseWindowsGroups即可。

既然ServiceAuthorizationBehavior是一個服務行為,我們隻需要通過編程或者配置的方式將該服務行為添加到當前服務的行為列表中就可以了。你可以按照下麵的編程方式讓寄宿的服務采用基於Windows用戶組授權模式。

   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得到這個ServiceAuthorizationBehavior對象。如下麵的代碼片斷所示,該屬性實際上是定義在ServiceHost的基類ServiceHostBase中。

   1: public abstract class ServiceHostBase
   2: {
   3:     //其他成員
   4:     public ServiceAuthorizationBehavior Authorization { get; }
   5: }

在讀取該屬性的時候,如果當前服務描述中的服務行為列表中找不到ServiceAuthorizationBehavior,係統會自動創建一個ServiceAuthorizationBehavior對象並添加到服務行為列表中。所以對於上麵的這段服務寄宿代碼實際和下麵是完全等效的。

   1: using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))
   2: {    
   3:     host.Authorization.PrincipalPermissionMode = PrincipalPermissionMode.UseWindowsGroups;
   4:     host.Open();
   5:     //...
   6: }

我們依然推薦采用配置的方式進行授權模式的設置。而下麵一段配置和上麵的代碼在作用上是等效的。

   1: <configuration>
   2:   <system.serviceModel>    
   3:     <services>
   4:       <service name="Artech.WcfServices.Services.CalculatorService" behaviorConfiguration="UseWindowsGroupsAuthorization">
   5:         <endpoint address="https://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>

為了讓讀者對基於Windows用戶組的授權具有深刻的認識,在《下篇》中我們通過一個簡單的事例來講解在真正的應用中該授權模式如何使用。

[WCF權限控製]基於Windows用戶組的授權方式[上篇]
[WCF權限控製]基於Windows用戶組的授權方式[下篇]


作者:蔣金楠
微信公眾賬號:大內老A
微博:www.weibo.com/artech
如果你想及時得到個人撰寫文章以及著作的消息推送,或者想看看個人推薦的技術資料,可以掃描左邊二維碼(或者長按識別二維碼)關注個人公眾號(原來公眾帳號蔣金楠的自媒體將會停用)。
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁麵明顯位置給出原文連接,否則保留追究法律責任的權利。
原文鏈接

最後更新:2017-10-26 16:34:09

  上一篇:go  [WCF權限控製]WCF的三種授權模式
  下一篇:go  [WCF權限控製]基於Windows用戶組的授權方式[下篇]