本節(jié)說明可用于修改或擴展 windows communication foundation (wcf) 安全組件的功能的各個擴展點,。若要了解這些擴展點,,必須了解總體 wcf 安全體系結(jié)構(gòu)。本主題從組件及其關(guān)系方面說明 wcf 安全體系結(jié)構(gòu)以及本節(jié)后面說明的擴展點如何適應(yīng)總體體系結(jié)構(gòu)模型。
wcf 安全組件的范圍
wcf 安全性跨越 wcf 體系結(jié)構(gòu)中的多個組件,。wcf 中安全性的主要目的是,,為建立在 wcf 框架基礎(chǔ)之上的應(yīng)用程序提供完整性、保密性,、身份驗證,、授權(quán)和審核。wcf 體系結(jié)構(gòu)將這些功能拆分為以下部分:
- 傳輸安全 - 負(fù)責(zé)提供消息保密性,、數(shù)據(jù)完整性和通信方的身份驗證,。
- 授權(quán) - 負(fù)責(zé)為授權(quán)決策提供框架。
- 審核 - 負(fù)責(zé)將安全相關(guān)事件記錄到審核日志中,。
本文檔說明的安全模式和范圍
傳輸安全可使用以下安全模式之一來執(zhí)行:
- 傳輸,。在客戶端和服務(wù)之間傳輸消息時使用的傳輸將提供所有三種通信安全功能。
- 消息,。僅在 soap 消息級別提供傳輸安全,,這意味著直接在 xml 級別將安全應(yīng)用于 soap 消息。
- 使用消息憑據(jù)的傳輸,。在傳輸層和消息層上都執(zhí)行傳輸安全,。傳輸層提供通信保密性、數(shù)據(jù)完整性和服務(wù)身份驗證,。消息層提供客戶端身份驗證,。
本文檔的其余部分著重介紹“消息”安全模式,但某些信息同樣適用于“使用消息憑據(jù)的傳輸”模式,。具體而言,,本文檔適用于客戶端身份驗證的部分也適用于“使用消息憑據(jù)的傳輸”模式,因為“使用消息憑據(jù)的傳輸”模式使用消息層執(zhí)行客戶端身份驗證的方式與“消息”模式相同,。
有關(guān)“身份驗證”和“審核”組件的討論同樣適用于所有三種安全模式,。因此,本文檔中說明的與這些組件相關(guān)的所有信息適用于所有支持的安全模式,。
消息安全模式概念
ws-security 模式
“消息”安全模式的基礎(chǔ)是 ws-security 規(guī)范,。ws-security 規(guī)范定義一個框架,該框架答應(yīng)對 soap 消息應(yīng)用安全,。該規(guī)范指定了一種結(jié)合數(shù)字簽名和加密使用安全令牌來保護 soap 消息并對其進行身份驗證的消息安全模式,。有關(guān)該規(guī)范的信息,請參見 web 服務(wù)安全 (ws-security)(可能為英文網(wǎng)頁),。
術(shù)語
安全令牌斷言聲明并可用于斷言身份驗證秘密或密鑰和安全標(biāo)識之間的綁定,。
聲明是由實體所做的有關(guān)實體(例如名稱、標(biāo)識,、組,、密鑰或特權(quán))的聲明,。作出聲明的實體稱為“聲明頒發(fā)者”;對其作出聲明的有關(guān)實體稱為“聲明主題”,。
聲明頒發(fā)者可以通過使用其密鑰對安全令牌進行簽名或加密來保證或認(rèn)可安全令牌中的聲明,。這會在安全令牌中啟用聲明的身份驗證。
消息簽名用于驗證消息來源和完整性,。消息簽名還可供消息創(chuàng)作者用于證實他們知道密鑰(通常來自第三方,,用于確認(rèn)安全令牌中的聲明),因此會將消息創(chuàng)作者的標(biāo)識(以及由安全令牌表示的任何其他聲明)綁定到所創(chuàng)建的消息,。
安全令牌
ws-security 定義了多種類型的安全令牌,,并提供了一個可擴展模型,答應(yīng)單獨定義其他的安全令牌類型,。每個令牌類型定義均包含令牌的 xml 序列化,。這答應(yīng)直接向消息添加令牌表示形式。
下面是 ws-security 中定義的一些安全令牌類型:
- 用戶名令牌,。
- x.509 證書令牌,。
- kerberos 令牌。
- saml 令牌,。
已定義四種令牌使用方式,,附加到給定消息的令牌只能屬于其中的一個類別:
- signedsupporting
- signedendorsing
- signedencrypted
- encryptedendorsing
在 .net framework 3.0 中,客戶端消息只能包含任何給定類型的一個令牌,,但是可以包含不同類型的令牌,。
在 .net framework 3.5 中,客戶端消息可以包含給定類型的多個令牌,,也可以包含不同類型的令牌,。
通過此功能可以實現(xiàn)多個方案,如下所述:
- 增量聲明發(fā)送,。對服務(wù)執(zhí)行的所有操作可能都要求一組聲明存在,,但是某些操作可能需要其他聲明??蛻舳瞬粚γ宽棽僮魇褂脝为氼C發(fā)的令牌,,而是獲得一個具有初始聲明集的已頒發(fā)令牌,并使用另一個已頒發(fā)的令牌(該令牌具有要調(diào)用的操作所需的其余聲明),。
- 多因素身份驗證,。在客戶端必須先收集多個頒發(fā)者頒發(fā)的令牌或具有不同聲明集的令牌,然后才能執(zhí)行操作時執(zhí)行,。wcf 將頒發(fā)的令牌視為一個令牌類型,,因此,在這種情況下會要求消息中能夠包含兩個已頒發(fā)的支持令牌,。
請注重,,不能以這種方式配置服務(wù):一個服務(wù)只能包含一個支持令牌。
有關(guān)更多信息,,請參見 如何:使用相同類型的多個安全令牌,。
ws-security 實現(xiàn)
由于 ws-security 為消息安全奠定了基礎(chǔ),因此 ws-security 的 wcf 實現(xiàn)是整個“消息”安全模式的基礎(chǔ),。若要擴展“消息”安全模式功能,,必須了解 ws-security 實現(xiàn)的工作方式。
wcf 中的 ws-security 實現(xiàn)處理以下操作:
- 安全令牌與 soap 消息之間的序列化,。
- 安全令牌的身份驗證,。
- 消息簽名的應(yīng)用和驗證。
- soap 消息的加密和解密,。
wcf 擴展點答應(yīng)自定義前兩項,。可以更改現(xiàn)有安全令牌的序列化或 wcf 安全對這些令牌進行身份驗證的方式,。也可能向 wcf 安全引入全新的安全令牌類型,,包括序列化和身份驗證功能。
本節(jié)的以下主題演示如何使用 ws-security 實現(xiàn)擴展點來自定義安全令牌功能,。
授權(quán)
安全令牌會在傳入消息中進行反序列化并進行身份驗證,。身份驗證過程會產(chǎn)生一組授權(quán)策略對象。每個對象均表示安全令牌數(shù)據(jù)的一部分,。在授權(quán)階段將使用這些數(shù)據(jù),。
授權(quán)策略創(chuàng)建給定的安全令牌表示的一組聲明。然后,,會將此聲明集提供給 serviceauthorizationmanager 和 authorizationcontext 屬性內(nèi)的邏輯以便作出授權(quán)決策,。
標(biāo)識
除了聲明外,wcf 還會創(chuàng)建 iidentity 接口的實現(xiàn),,用于表示現(xiàn)有基礎(chǔ)結(jié)構(gòu)(使用 .net framework 安全模型創(chuàng)建)的調(diào)用方,。此 iidentity 實例表示調(diào)用方的 windows 標(biāo)識(假如該安全令牌映射到 windows 帳戶)或包含調(diào)用方名稱的主標(biāo)識。這些標(biāo)識還可以使用 servicesecuritycontext 進行訪問,。(有關(guān)更多信息,,請參見 如何:檢查安全上下文。)通過使用以下方法之一,,可以自定義在 wcf 中創(chuàng)建標(biāo)識的方式:
- 實現(xiàn) securitytokenauthenticator 類的自定義擴展,。
- 通過擴展 membershipprovider 類,或通過創(chuàng)建自定義 iauthorizationpolicy 實現(xiàn)并將其插入到 serviceauthorizationmanager 中,,與 asp.net 集成,。
- 創(chuàng)建自定義 iauthorizationpolicy。
僅當(dāng)使用用戶名/密碼身份驗證對調(diào)用方進行身份驗證時,,自定義成員資格提供程序才能工作,。membershipprovider 驗證 用戶名/密碼對,。假如為有效對,wcf 將在 membershipprovider 驗證后創(chuàng)建表示已進行身份驗證的調(diào)用方的主標(biāo)識,。
為便于與現(xiàn)有的 .net framework 安全基礎(chǔ)結(jié)構(gòu)集成,,默認(rèn)情況下,wcf 將 currentprincipal 屬性設(shè)置為一個表示調(diào)用方的 iprincipal 實例,。iprincipal 實例是基于所生成的 iidentity 中包含的信息創(chuàng)建的,。
通過與 asp.net roleprovider 集成,可以進一步擴充 iidentity,。roleprovider 會添加調(diào)用方所屬的角色集,。授權(quán)邏輯將使用此信息做出訪問決策。
有關(guān) 標(biāo)識的更多信息,,請參見服務(wù)標(biāo)識和身份驗證,。
發(fā)送安全消息
下圖顯示使用“消息”安全模式時如何在客戶端保證消息的安全。該圖顯示了涉及的組件和它們之間的關(guān)系:
- 應(yīng)用程序代碼運行并生成消息,。
- 在令牌配置階段,,附加客戶端憑據(jù)(如 x.509 證書)。在聯(lián)合身份驗證方案中,,將聯(lián)系令牌頒發(fā)者以提供憑據(jù),。
- 使用這些憑據(jù)創(chuàng)建安全令牌。
- 在令牌身份驗證階段驗證令牌,。
- 最后,,序列化并發(fā)送安全令牌。
接收安全消息
下圖顯示在從網(wǎng)絡(luò)提取安全消息并在接收端驗證這些安全消息時發(fā)生的過程:
- 在令牌身份驗證階段對安全令牌進行反序列化和處理,。假如需要,,可以在此時使用 asp.net 成員資格提供程序提供用戶名和密碼。
- 進行身份驗證后,,提取授權(quán)策略,。
- 在授權(quán)策略評估階段,評估授權(quán)策略并可將聲明添加到評估上下文中,。此時也使用外部授權(quán)策略,。這一步以及下一步是通過 serviceauthorizationmanager 的方法完成的。
- 在服務(wù)授權(quán)階段,,基于由授權(quán)策略添加的聲明賦予正確的授權(quán),。這一步是通過 serviceauthorizationmanager 的方法完成的。
- 授權(quán)之后,,假如調(diào)用方答應(yīng)且服務(wù)方法需要進行調(diào)用方模擬,,或?qū)Ψ?wù)授權(quán)行為設(shè)置了 impersonatecallerforalloperations 屬性,則會進行調(diào)用方模擬,。有關(guān)更多信息,,請參見 wcf 的委派和模擬,。
- 此時,wcf 將使用憑據(jù)生成 principalpermission,。假如需要,,可以在此時使用 asp.net 角色提供程序。
- 應(yīng)用程序代碼運行,。
安全擴展點概述
下圖顯示由 wcf 安全組件提供的擴展點,。該圖分為四個不同類別,,具體取決于消息處理過程中到達擴展點的時間,。這些類別可映射到消息安全處理階段,如前兩節(jié)所述,。該圖還顯示可以將現(xiàn)有基礎(chǔ)結(jié)構(gòu)技術(shù)與 wcf 安全相集成,。