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