身份驗證和授權由不可分割的關(guān)系,在考慮授權時(shí),也必須考慮身份驗證。這兩個(gè)過(guò)程緊密相關(guān)。其中有以下兩個(gè)方面的原因:
• 第一,任何有意義的授權策略都需要已驗證身份的用戶(hù)。
• 第二,驗證用戶(hù)標識的方式(具體說(shuō),就是如何在應用程序中表示已經(jīng)過(guò)驗證的用戶(hù)標識)將決定您可支配的網(wǎng)關(guān)守衛。
某些網(wǎng)關(guān)守衛(例如 ASP.NET 文件授權、企業(yè)服務(wù) (COM+) 角色和 Windows ACL)要求經(jīng)過(guò)身份驗證的 Windows 標識,此類(lèi)標識采用 WindowsIdentity 對象的形式,該對象封裝的是用來(lái)定義調用方安全性上下文的 Windows 訪(fǎng)問(wèn)令牌。而其他網(wǎng)關(guān)守衛(例如 ASP.NET URL 授權和 .NET 角色)則無(wú)此要求。它們只要求標識經(jīng)過(guò)驗證即可,并不需要一定要用 Windows 訪(fǎng)問(wèn)令牌來(lái)表示標識。
身份驗證
如果是ASP.NET程序,那么可以考慮使用ASP.NET成員資格提供程序。另外一個(gè)值得考慮的就是使用自定義 用戶(hù)名和密碼的驗證程序。
默認情況下,當用戶(hù)名和密碼用于身份驗證時(shí),WCF會(huì )使用Windwos來(lái)驗證用戶(hù)名和密碼。不過(guò)WCF允許自定義用戶(hù)名和密碼的身份驗證方案,也稱(chēng)為“驗證程序”。
1.創(chuàng )建一個(gè)從 UserNamePasswordValidator 派生的類(lèi)。
2.通過(guò)重寫(xiě) Validate 方法,實(shí)現自定義身份驗證方案。
3.一般考慮檢索數據庫
4.若要將身份驗證錯誤返回到客戶(hù)端,應在 Validate 方法中引發(fā) FaultException。
要使用身份驗證,需要配置一個(gè)使用傳送消息安全或者消息安全的綁定。
訪(fǎng)問(wèn)控制
WCF,可以采用多種方式來(lái)控制訪(fǎng)問(wèn)。訪(fǎng)問(wèn)技術(shù)按復雜程度順序列出。最簡(jiǎn)單的是 PrincipalPermissionAttribute;ASP.NET 角色提供程序;授權管理器;而最復雜的是標識模型。
PrincipalPermissionAttribute 用于限制對服務(wù)方法的訪(fǎng)問(wèn)。將該屬性應用于方法時(shí),它可用于請求特定調用方在 Windows 組或 ASP.NET 角色中的標識或成員資格。如果使用 X.509 證書(shū)對客戶(hù)端進(jìn)行身份驗證,則將為該客戶(hù)端提供一個(gè)由該證書(shū)的主題名稱(chēng)和指紋組成的主標識。
如果服務(wù)用戶(hù)將始終屬于運行服務(wù)的同一個(gè) Windows 域的成員,請使用 PrincipalPermissionAttribute 來(lái)控制對運行服務(wù)的計算機上的資源的訪(fǎng)問(wèn)。您可以輕松創(chuàng )建已指定訪(fǎng)問(wèn)級別(如,無(wú)、只讀或讀寫(xiě))的 Windows 組。
成員資格提供程序是 ASP.NET 中的一項功能。雖然成員資格提供程序在技術(shù)上不是訪(fǎng)問(wèn)控制機制,但它允許通過(guò)限制可以訪(fǎng)問(wèn)服務(wù)終結點(diǎn)的可能標識的集來(lái)控制對服務(wù)的訪(fǎng)問(wèn)。成員資格功能包括一個(gè)可以用用戶(hù)名/密碼組合(允許網(wǎng)站用戶(hù)開(kāi)立該網(wǎng)站的帳戶(hù))來(lái)填充的數據庫。若要訪(fǎng)問(wèn)使用成員資格提供程序的服務(wù),用戶(hù)必須使用自己的用戶(hù)名和密碼登錄。
ASP.NET 還有一項使用角色管理授權的功能。使用 ASP.NET 角色提供程序,開(kāi)發(fā)人員可以為用戶(hù)創(chuàng )建角色,然后將每個(gè)用戶(hù)分配給一個(gè)或多個(gè)角色。與成員資格提供程序一樣,角色和分配也存儲在數據庫中,而且可以使用由 ASP.NET 角色提供程序的專(zhuān)門(mén)實(shí)現所提供的工具來(lái)進(jìn)行填充。與成員資格功能一樣,WCF 開(kāi)發(fā)人員可以使用該數據庫中的信息按角色對服務(wù)用戶(hù)進(jìn)行授權。例如,他們可以將該角色提供程序與上述 PrincipalPermissionAttribute 訪(fǎng)問(wèn)控制機制結合使用。
另一個(gè)功能將授權管理器 (AzMan) 與 ASP.NET 角色提供程序結合在一起對客戶(hù)端進(jìn)行授權。在 ASP.NET 承載 Web 服務(wù)時(shí),可以將 AzMan 集成到應用程序中,以便可以通過(guò) AzMan 完成向服務(wù)的授權。ASP.NET 角色管理器提供了一個(gè) API,該 API 使您能夠管理應用程序角色、在角色中添加和移除用戶(hù)以及檢查角色的成員資格,但不允許您查詢(xún)用戶(hù)是否經(jīng)授權執行命名的任務(wù)或操作。AzMan 允許您定義單個(gè)操作,然后將這些操作組合成任務(wù)。使用 AZMan,除了可以執行角色檢查以外,還可以檢查用戶(hù)是否可以執行某項任務(wù)。角色分配和任務(wù)授權可以在應用程序外部配置,也可以在應用程序內部以編程方式執行。使用 AzMan 管理 Microsoft 管理控制臺 (MMC) 管理單元,管理員可以更改角色可以在運行時(shí)執行的任務(wù),還可以管理每個(gè)用戶(hù)的角色成員資格。
標識模型是一組 API,可以用于管理用于向客戶(hù)端授權的聲明和策略。使用標識模型,可以檢查包含在調用方用于將其自身向服務(wù)進(jìn)行身份驗證的憑據中的每個(gè)聲明,將這些聲明與服務(wù)策略的集進(jìn)行比較,然后基于比較結果授予或拒絕訪(fǎng)問(wèn)權限。
如果在授予訪(fǎng)問(wèn)權限之前需要良好的控制以及可以設置特定的條件,請使用標識模型。例如,在使用 PrincipalPermissionAttribute 時(shí),標準不過(guò)是對用戶(hù)的標識進(jìn)行身份驗證以及該用戶(hù)標識屬于特定的角色。相比之下,使用標識模型,您可以創(chuàng )建如下策略:規定用戶(hù)必須年滿(mǎn) 18 周歲,并且必須持有有效的駕駛執照才準許查看文檔。
一個(gè)您可以從標識模型的基于聲明的訪(fǎng)問(wèn)控制中獲益的示例是在頒發(fā)的令牌方案中使用聯(lián)合憑據的情形。有關(guān) 聯(lián)合和頒發(fā)的令牌的更多信息,請參見(jiàn)聯(lián)合令牌與頒發(fā)的令牌。
參考:
聯(lián)系客服