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

接收安全消息
下圖顯示在從網(wǎng)絡(luò)提取安全消息并在接收端驗(yàn)證這些安全消息時發(fā)生的過程:
- 在令牌身份驗(yàn)證階段對安全令牌進(jìn)行反序列化和處理。假如需要,可以在此時使用 asp.net 成員資格提供程序提供用戶名和密碼。
- 進(jìn)行身份驗(yàn)證后,提取授權(quán)策略。
- 在授權(quán)策略評估階段,評估授權(quán)策略并可將聲明添加到評估上下文中。此時也使用外部授權(quán)策略。這一步以及下一步是通過 serviceauthorizationmanager 的方法完成的。
- 在服務(wù)授權(quán)階段,基于由授權(quán)策略添加的聲明賦予正確的授權(quán)。這一步是通過 serviceauthorizationmanager 的方法完成的。
- 授權(quán)之后,假如調(diào)用方答應(yīng)且服務(wù)方法需要進(jìn)行調(diào)用方模擬,或?qū)Ψ?wù)授權(quán)行為設(shè)置了 impersonatecallerforalloperations 屬性,則會進(jìn)行調(diào)用方模擬。有關(guān)更多信息,請參見 wcf 的委派和模擬。
- 此時,wcf 將使用憑據(jù)生成 principalpermission。假如需要,可以在此時使用 asp.net 角色提供程序。
- 應(yīng)用程序代碼運(yùn)行。

安全擴(kuò)展點(diǎn)概述
下圖顯示由 wcf 安全組件提供的擴(kuò)展點(diǎn)。該圖分為四個不同類別,具體取決于消息處理過程中到達(dá)擴(kuò)展點(diǎn)的時間。這些類別可映射到消息安全處理階段,如前兩節(jié)所述。該圖還顯示可以將現(xiàn)有基礎(chǔ)結(jié)構(gòu)技術(shù)與 wcf 安全相集成。
