前面已經(jīng)了解到,WCF的安全包括了傳送安全、授權(quán)(訪問控制)和審核。現(xiàn)在對(duì)傳送安全做進(jìn)一步的介紹。
傳送安全方案
使用WCF傳輸安全的常見方案包括:
· 使用 Windows 確保傳輸安全。WCF 客戶端和服務(wù)部署在 Windows 域(或 Windows 目錄林)中。消息包含個(gè)人數(shù)據(jù),因此要求客戶端和服務(wù)相互進(jìn)行身份驗(yàn)證,要求實(shí)現(xiàn)消息完整性和消息保密性。此外,還需要有已發(fā)生特定事務(wù)的證明,例如,消息的接收方應(yīng)記錄簽名信息。
· 使用 UserName 和 HTTPS 確保傳輸安全。WCF 客戶端和服務(wù)需要一些開發(fā)工作,以便通過 Internet 工作??蛻舳藨{據(jù)根據(jù)數(shù)據(jù)庫(kù)(其中的內(nèi)容為用戶名/密碼對(duì))進(jìn)行身份驗(yàn)證。服務(wù)是用受信任的安全套接字層 (SSL) 證書部署在一個(gè) HTTPS 地址的。由于消息是通過 Internet 傳輸?shù)?,因此,客戶端和服?wù)需要相互進(jìn)行身份驗(yàn)證,并且必須在傳輸過程中保持消息的保密性和完整性。
· 使用證書確保傳輸安全。WCF 客戶端和服務(wù)需要一些開發(fā)工作,以便通過公共 Internet 工作??蛻舳撕头?wù)都具有可用于確保消息安全的證書??蛻舳撕头?wù)通過 Internet 進(jìn)行相互通信,執(zhí)行要求消息完整性、保密性和相互身份驗(yàn)證的重要事務(wù)。
傳輸安全模式
在前面已經(jīng)提到了傳送安全的模式,主要有傳送安全和消息安全,現(xiàn)在列出所有的安全模式:
窗體頂端
模式
說明
None
傳輸層和消息層都不提供安全措施。默認(rèn)情況下,預(yù)定義綁定都不使用此模式,只有
<basicHttpBinding> 元素(使用代碼時(shí),則為
BasicHttpBinding 類)例外。
Transport
使用安全傳送(如 HTTPS)實(shí)現(xiàn)完整性、保密性和相互身份驗(yàn)證。
Message
使用 SOAP 消息安全實(shí)現(xiàn)完整性、保密性和相互身份驗(yàn)證。SOAP 消息是按照
WS-Security 標(biāo)準(zhǔn)獲得保護(hù)的。
混合模式
使用傳送安全實(shí)現(xiàn)完整性、保密性和服務(wù)器身份驗(yàn)證。使用消息安全(WS-Security 和其他標(biāo)準(zhǔn))實(shí)現(xiàn)客戶端身份驗(yàn)證。
(此模式的枚舉值是 TransportWithMessageCredential。)
消息和傳送
在傳送級(jí)別和消息級(jí)別都執(zhí)行保護(hù)和身份驗(yàn)證。此模式僅在
<netMsmqBinding> 元素中可用。
傳送和傳輸?shù)膶?duì)比在前面已經(jīng)提過。
憑據(jù)
憑據(jù)是一些數(shù)據(jù),用于證實(shí)已聲明標(biāo)識(shí)或功能。出示憑據(jù)包括出示數(shù)據(jù)以及數(shù)據(jù)的所有權(quán)證明。WCF 在傳輸和消息安全級(jí)別支持多種憑據(jù)類型。您可以為 WCF 綁定指定憑據(jù)類型。
在許多國(guó)家和地區(qū),駕駛執(zhí)照就是憑據(jù)的一個(gè)示例。該執(zhí)照中包含表示個(gè)人身份和能力的數(shù)據(jù)。它以持有人照片的形式包含所有權(quán)證明。該執(zhí)照由受信任的頒發(fā)機(jī)構(gòu)頒發(fā),通常是獲得許可的政府部門。該執(zhí)照采用密封形式且包含一張全息圖,表明它未經(jīng)改動(dòng)或偽造。
例如,考慮 WCF 中支持的兩種憑據(jù)類型:用戶名和 (X.509) 證書憑據(jù)。對(duì)于用戶名憑據(jù),用戶名表示已聲明標(biāo)識(shí),密碼表示所有權(quán)證明。這種情況下,受信任的頒發(fā)機(jī)構(gòu)則是驗(yàn)證用戶名和密碼的系統(tǒng)。在證書憑據(jù)中,主題名稱、主題備用名稱或證書中的特定字段可用于表示已聲明標(biāo)識(shí)和/或功能。憑據(jù)中的數(shù)據(jù)所有權(quán)證明的建立,是用關(guān)聯(lián)私鑰生成簽名實(shí)現(xiàn)的。
傳送客戶端憑據(jù)類型
下表列出了在創(chuàng)建使用傳輸安全的應(yīng)用程序時(shí)可能使用的值。在代碼或綁定設(shè)置中,可以使用這些值。
設(shè)置
說明
None
指定客戶端不需要提供任何憑據(jù)。這相當(dāng)于匿名客戶端。
Basic
指定基本身份驗(yàn)證。有關(guān)其他信息,請(qǐng)參見 RFC2617“
HTTP 身份驗(yàn)證:基本和摘要式身份驗(yàn)證(可能為英文網(wǎng)頁(yè))。”
Digest
指定摘要式身份驗(yàn)證。有關(guān)其他信息,請(qǐng)參見 RFC2617“
HTTP 身份驗(yàn)證:基本和摘要式身份驗(yàn)證(可能為英文網(wǎng)頁(yè))。”
Ntlm
指定在 Windows 域中使用 SSPI 協(xié)商進(jìn)行 Windows 身份驗(yàn)證。
要使用 SSPI 協(xié)商,就需要使用 Kerberos 協(xié)議或 NT LanMan (NTLM)。
Windows
指定在 Windows 域中使用 SSPI 進(jìn)行 Windows 身份驗(yàn)證。SSPI 選擇 Kerberos 協(xié)議或 NTLM 作為身份驗(yàn)證服務(wù)。
SSPI 首先嘗試 Kerberos 協(xié)議;如果失敗,則使用 NTLM。
Certificate
使用證書(通常是 X.509)執(zhí)行客戶端身份驗(yàn)證。
消息客戶端憑據(jù)類型
下表列出了在創(chuàng)建使用消息安全的應(yīng)用程序時(shí)可能使用的值。在代碼或綁定設(shè)置中,可以使用這些值。
設(shè)置
說明
None
允許服務(wù)與匿名客戶端交互。
Windows
允許在 Windows 憑據(jù)的已通過身份驗(yàn)證的上下文中執(zhí)行 SOAP 消息交換。使用 SSPI 協(xié)商機(jī)制選擇 Kerberos 協(xié)議或 NTLM 作為身份驗(yàn)證服務(wù)。
Username
允許服務(wù)可以要求使用用戶名憑據(jù)對(duì)客戶端進(jìn)行身份驗(yàn)證。請(qǐng)注意,WCF 不允許對(duì)用戶名進(jìn)行任何加密操作,例如生成簽名或加密數(shù)據(jù)。因此,WCF 強(qiáng)制要求在使用用戶名憑據(jù)時(shí)確保傳輸?shù)陌踩浴?div style="height:15px;">
證書
允許服務(wù)要求使用證書對(duì)客戶端進(jìn)行身份驗(yàn)證。
CardSpace
允許服務(wù)要求使用 CardSpace 對(duì)客戶端進(jìn)行身份驗(yàn)證。
憑據(jù)編程
對(duì)于每個(gè)客戶端憑據(jù)類型,WCF 編程模型都允許通過服務(wù)行為和通道行為來指定憑據(jù)值和憑據(jù)驗(yàn)證程序。
WCF 安全有兩種憑據(jù)類型:服務(wù)憑據(jù)行為和通道憑據(jù)行為。WCF 中的憑據(jù)行為指定實(shí)際數(shù)據(jù),即用于滿足安全要求(通過綁定表示)的憑據(jù)。在 WCF 中,客戶端類是運(yùn)行時(shí)組件,它在操作調(diào)用和消息之間進(jìn)行轉(zhuǎn)換。所有客戶端都是從
ClientBase 類繼承的。通過基類的
ClientCredentials 屬性,可以指定不同的客戶端憑據(jù)值。
在 WCF 中,服務(wù)行為是一些屬性,它們?cè)趯?shí)現(xiàn)服務(wù)協(xié)定(接口)的類中應(yīng)用,以編程方式對(duì)服務(wù)進(jìn)行控制。使用
ServiceCredentials 類,可以為服務(wù)憑據(jù)指定證書,也可以為不同的客戶端憑據(jù)類型指定客戶端驗(yàn)證設(shè)置。
傳輸安全編程
1.選擇一個(gè)適合于應(yīng)用程序要求的預(yù)定義綁定。
有關(guān)綁定選擇的列表,請(qǐng)參見
系統(tǒng)提供的綁定。默認(rèn)情況下,幾乎每個(gè)綁定都啟用了安全。一個(gè)例外是 BasicHttpBinding 類(使用配置時(shí),為 basicHttpBinding Element)。
2.
選擇一個(gè)安全模式(Transport、Message、TransportWithMessageCredential)。
請(qǐng)注意,所選的綁定確定了可以進(jìn)行的模式選擇。例如,
WSDualHttpBinding 不允許啟用傳輸安全(它不是選項(xiàng))。同樣,
MsmqIntegrationBinding 和
NetNamedPipeBinding 都不允許啟用消息安全。
如果決定對(duì) HTTP 使用傳輸安全(即 HTTPS),還必須用 SSL 證書配置宿主并且在端口上啟用 SSL。
如果您要使用 WSHttpBinding 并且不需要建立
安全會(huì)話,請(qǐng)將 EstablishSecurityContext 屬性設(shè)置為 false(除 basicHttpBinding Element綁定外,已啟用消息安全時(shí),Windows Communication Foundation (WCF) 中系統(tǒng)提供的綁定將自動(dòng)使用安全會(huì)話),對(duì)于其他系統(tǒng)提供的綁定,只能通過創(chuàng)建自定義綁定來關(guān)閉安全會(huì)話。當(dāng)客戶端和服務(wù)使用對(duì)稱密鑰創(chuàng)建通道時(shí)(客戶端和服務(wù)器在整個(gè)對(duì)話過程中都使用相同的密鑰,直到對(duì)話結(jié)束),將發(fā)生安全會(huì)話。
3.
設(shè)置客戶端憑據(jù)配型選擇適當(dāng)?shù)目蛻舳藨{據(jù)類型。有關(guān)更多信息,請(qǐng)參見 選擇憑據(jù)類型。下列客戶端憑據(jù)類型可用:
l Windows
l Certificate
l Digest
l Basic
l UserName
l NTLM
l IssuedToken
根據(jù)您設(shè)置模式的方式的不同,必須設(shè)置憑據(jù)類型。例如,如果您已經(jīng)選擇了 wsHttpBinding,并且將模式設(shè)置為“Message”,則還可以將 Message 元素的 clientCredentialType 屬性設(shè)置為下列值之一:None、Windows、UserName、Certificate 和 IssuedToken,如下面的配置示例所示。
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="myBinding">
<security mode="Message"/>
<message clientCredentialType="Windows"/>
</binding>
</bindings>
</system.serviceModel>
或者在代碼中:
設(shè)置服務(wù)憑據(jù)值
一旦選擇了客戶端憑據(jù)類型,就必須設(shè)置可供服務(wù)和客戶端使用的實(shí)際憑據(jù)。在服務(wù)上,使用 ServiceCredentials 類設(shè)置憑據(jù),并且由 ServiceHostBase 類的 Credentials 屬性返回。所使用的綁定暗示了服務(wù)憑據(jù)類型、選擇的安全模式和客戶端憑據(jù)類型。下面的代碼為服務(wù)憑據(jù)設(shè)置了證書。
設(shè)置客戶端憑據(jù)值
在客戶端上,使用 ClientCredentials 類設(shè)置客戶端憑據(jù)值,并且通過 ClientBase 類的 ClientCredentials 屬性返回該值。
參考:
分布式應(yīng)用程序安全WCF 安全編程例子可以參考:
老徐的博客