監(jiān)理公司管理系統(tǒng) | 工程企業(yè)管理系統(tǒng) | OA系統(tǒng) | ERP系統(tǒng) | 造價咨詢管理系統(tǒng) | 工程設(shè)計管理系統(tǒng) | 甲方項目管理系統(tǒng) | 簽約案例 | 客戶案例 | 在線試用
X 關(guān)閉

HTTP安全性和ASP.NET Web服務(wù)

申請免費試用、咨詢電話:400-8352-114

AMTeam.org

HTTP安全性和ASP.NET Web服務(wù)

摘要:目前,基于 HTTP 的安全機制是保證您的 Web 服務(wù)安全的最好方法。了解如何結(jié)合使用 Microsoft IIS 與 Microsoft ASP.NET 來保證 Web 服務(wù)的安全。

注意:本文假設(shè)您已經(jīng)比較熟悉如何配合使用 SSL 和 IIS。
  
簡介
  
有一個一直讓 Web 服務(wù)開發(fā)人員感到頭疼的課題,那就是:如何使 IIS 和 ASP.NET Web 服務(wù)協(xié)同工作以提供安全性?,F(xiàn)在,我們通過 IIS 來處理安全問題,并通過 ASP.NET 進行調(diào)節(jié)。ASP.NET 可以接受 IIS 提供的身份標識信息并使用該信息來了解調(diào)用者是誰,或者利用代碼訪問安全性在 Web 服務(wù)上執(zhí)行特定操作。對于許多人而言,最大的問題是如何使 .NET 應(yīng)用程序利用內(nèi)置的 IIS 安全保護功能。在不遠的將來,WS-Security 將是您的更佳選擇。在那一天到來之前,HTTP 級的安全保護將是我們許多人用來保證信息安全的方法。

當以安全的方式執(zhí)行 Web 方法時,必須涉及以下各項:

保密使偵聽對話的實體不能直接看到數(shù)據(jù)。

完整性向接收者提供對 SOAP 消息所作更改進行檢測的能力。

身份驗證回答“調(diào)用者是誰”的問題。

授權(quán)回答“調(diào)用者是否有權(quán)訪問該 Web 方法”的問題。

認可證明所發(fā)生的操作,以防止客戶端在事務(wù)處理中欺詐或否認。
  
這些安全保護功能常常是配合使用的。身份驗證允許授權(quán)和認可的發(fā)生。SSL 提供的保密措施也包括完整性和身份驗證機制。本文假設(shè)您已經(jīng)比較熟悉如何配合使用 SSL 和 IIS。如果您不熟悉,請查看本文末尾的資源。同時,建議您查找安裝了證書服務(wù)器的 Microsoft? Windows? 服務(wù)器,或者在可用的 Windows 服務(wù)器上安裝證書服務(wù)器。這將對理解本文有關(guān) SSL 的部分有所幫助。

使用 SSL 進行加密和簽名
  
任何時候當您需要對基于 HTTP 的 SOAP 消息進行保密時,都應(yīng)該通過 SSL 運行服務(wù)。它將對通過線路查看數(shù)據(jù)傳輸?shù)膶嶓w隱藏 Web 服務(wù)中的數(shù)據(jù)。

為了使用本節(jié)中的數(shù)據(jù),在您的 Web 服務(wù)器的根目錄下必須安裝有 X.509 證書。。正確安裝證書后,您便可以為虛擬目錄或特定文件選擇強制執(zhí)行 SSL 身份驗證。

  
打開 Internet Information Services 管理控制臺的步驟

在“開始”菜單中單擊“運行”。

在“打開”編輯框中,鍵入 inetmgr。

單擊“確定”。

這樣,IIS 管理控制臺就打開了。

為虛擬目錄或特定文件請求 SSL 就是在 IIS 中選擇正確的選項。要選擇“正確的選項”,請瀏覽到 IIS 管理控制臺中的虛擬目錄。如果您想為可以通過給定的虛擬目錄進行訪問的所有 Web 服務(wù)請求 SSL,請右鍵單擊該虛擬目錄,單擊“屬性”,然后單擊“目錄安全性”選項卡。

如果只保護某個特定的 Web 服務(wù),請右鍵單擊與該 Web 服務(wù)關(guān)聯(lián)的 .asmx 文件,單擊“屬性”,然后單擊“文件安全性”選項卡。不管執(zhí)行哪個步驟,您都將看到一個與圖 1 類似的對話框。請在“安全通信”下,單擊“編輯”,將打開如圖 2 所示的“安全通信”對話框。

 

圖 1:IIS 管理控制臺中的“安全性”選項卡

 

圖 2:“安全通信”對話框

默認情況下“需要安全通道 (SSL)”復選框沒有被選中,請選中該復選框以請求 SSL。SSL 支持 40 位和 128 位加密。加密使用的位數(shù)越多,破譯和找出原始位就越困難。這就是為特定的 .asmx 文件或整個 Web 服務(wù)啟用 SSL 所要做的全部工作。這樣,只要 Web 服務(wù)器的證書不受威脅,所有 Web 服務(wù)客戶端和 Web 服務(wù)本身都將是安全的。SSL 使用包含公鑰的 X.509 證書,可能還包含一個私鑰。如果私鑰被外部用戶知道,則使用公鑰加密的通信就可能會被外部用戶偵測到,從而變得不安全。

一旦您將資源設(shè)置為通信時需要 SSL,則發(fā)送者和接收者之間傳送的信息就將被加密并簽名。也就是說,外部用戶將無法閱讀消息的內(nèi)容。如果外部用戶改變了消息的字節(jié)數(shù),消息接收者可以檢測到更改。

身份驗證
  
為了利用 IIS 給您提供的身份驗證,您需要編輯與您的 Web 服務(wù)關(guān)聯(lián)的 Web.config 文件。要使用戶的身份在 HttpContext 中可用,您需要將 /configuration/system.web/authentication/@mode 屬性設(shè)置為 Windows。當 IIS 使用以下身份驗證方式之一時,必須設(shè)置模式屬性:基本、簡要、集成 Windows 身份驗證 (NTLM/Kerberos) 或 X.509 證書。上述任何一種身份驗證提供的用戶憑據(jù)都必須映射回本地計算機或 Active Directory 中的用戶。

IIS 和正確的 Web.config 設(shè)置結(jié)合使用將使 Web 服務(wù)能夠發(fā)現(xiàn)調(diào)用者的身份標識。作為新增的優(yōu)點,請求上下文將假設(shè)調(diào)用者的身份。如果要利用 Windows 身份驗證,Web.config 文件應(yīng)該如下所示:

<configuration>
<system.web>
<authentication mode="Windows" />
<!-- 其他元素將放在此處 -->
</system.web>
</configuration>

為了處理身份驗證、審核和認可,打開 Windows 身份驗證是很關(guān)鍵的。這樣做的目的是使您的 Web 方法以調(diào)用者的身份運行。所有記錄、訪問檢查等都是根據(jù)用戶的權(quán)限來執(zhí)行的。

為了強制 IIS 提供調(diào)用者的身份標識,您需要告訴 IIS 關(guān)閉匿名訪問。就是這么簡單,真的。要執(zhí)行此操作,請返回并打開 inetmgr(單擊“開始”->“運行”,然后鍵入 inetmgr)。瀏覽到所需的虛擬目錄。右鍵單擊虛擬目錄或 .asmx 文件(這取決于您需要對虛擬目錄中的所有文件實施身份標識還是僅對一個 Web 服務(wù)實施身份標識),然后單擊“屬性”。單擊“目錄安全性”選項卡,如圖 1 所示。在“匿名訪問和驗證控制”中,單擊“編輯”。將打開如圖 3 所示的“身份驗證方法”對話框。

 

圖 3:禁用匿名訪問的“身份驗證方法”對話框

“身份驗證方法”對話框允許您配置用戶訪問虛擬目錄或文件的方法。要通過 HTTP 信息頭傳遞用戶憑據(jù),您可以使用基本或簡要身份驗證?;竞秃喴矸蒡炞C均不提供任何確保消息安全的機制。傳遞用戶憑據(jù)的機制由 RFC 2617: HTTP Authentication: Basic and Digest Access Authentication定義?;旧希褂靡粋€名為 Authorization 的 HTTP 信息頭來傳遞用戶名和密碼。對于基本身份驗證而言,用戶名/密碼組合是以明文的方式發(fā)送的。不過,也不全是這樣。實際上,用戶名和密碼是使用簡單明文形式的 base64 編碼方法來發(fā)送的。如果您不熟悉 base64 編碼,可以使用二進制數(shù)據(jù)并以文本形式提供這些數(shù)據(jù)。對數(shù)據(jù)進行編碼時,不使用機密/密鑰。如果選擇使用基本身份驗證,則只能接受通過 SSL 的憑據(jù)。這可以保護 Web 服務(wù)和調(diào)用者免受試圖攻擊通道以捕獲有效憑據(jù)集的實體的威脅。

還可以使用簡要身份驗證。如果選擇此選項,您必須了解,許多 SOAP 工具包都不支持簡要身份驗證。因而,可以使用 Web 服務(wù)的工具包數(shù)量將受到限制。如果想知道調(diào)用者的身份,而目標 SOAP 工具包支持簡要身份驗證并且 SOAP 消息的內(nèi)容不是特別重要,則請使用簡要身份驗證。簡要身份驗證使用名為 nonce 的共享機密為調(diào)用者的憑據(jù)進行加密。

基本和簡要身份驗證都使用質(zhì)詢-響應(yīng)機制。正因為如此,在 Web 方法調(diào)用發(fā)生之前,客戶端和接收器之間將發(fā)送多次請求和響應(yīng)。在基本身份驗證中,質(zhì)詢和響應(yīng)的速度都相當快。事實上,如果客戶端知道需要基本身份驗證,它會提早提供基本憑據(jù)。這種提速可以是需要驗證服務(wù)器證書并建立會話密鑰的、基于 SSL 的連接中的臨界值。在簡要身份驗證中,在憑據(jù)被加密前,需要交換 nonce。同樣,在 Web 服務(wù)代碼被執(zhí)行之前需要執(zhí)行一些握手操作。

要針對 Web 服務(wù)強制啟用這些項,只需要在“身份驗證方法”對話框中選中相應(yīng)的框即可。如果您確認只需要獲取已經(jīng)過身份驗證的用戶,請確保取消選中“匿名訪問”復選框。完成這一步后,您便可以在服務(wù)器端進行以下操作:

搜索調(diào)用者。

使用代碼訪問安全性限制調(diào)用者可以調(diào)用的方法。
  
以下 Web 服務(wù)返回當前的調(diào)用者信息:

[WebMethod]
public string WhoAmI() {
return "正在作為用戶運行: " +
Thread.CurrentPrincipal.Identity.Name;
}

我們將修改一個調(diào)用該 Web 服務(wù)的簡單的控制臺應(yīng)用程序。開始時,客戶端如下所示:

static void Main(string[] args) {
localhost.Sample svc = new localhost.Sample();
try {
Console.WriteLine( svc.WhoAmI() );
} catch ( Exception ex ) {
Console.WriteLine( ex.ToString() );
} finally {
svc.Dispose();
}
}

如果沒有對 Web 服務(wù)/應(yīng)用程序應(yīng)用安全保護,Main 函數(shù)將打印以下信息:

 

圖 4:無安全保護運行,因而也沒有身份標識

如果您通過圖 3 中的對話框關(guān)閉匿名訪問,客戶端將無法訪問 Web 服務(wù)。相反,將顯示以下錯誤消息:

System.Net.WebException: 請求失敗,HTTP 狀態(tài) 401: 訪問被拒絕。

為什么會是這樣呢?默認情況下,Web 服務(wù)代理不包含任何關(guān)于調(diào)用者或要傳遞的憑據(jù)的信息。因為不能驗證自己的身份,調(diào)用 Web 方法的嘗試失敗,并且引發(fā)異常。如果您想為當前用戶傳遞正確的憑據(jù),最簡單的方法是沿著當前用戶的默認憑據(jù)傳遞??蛻舳酥械?try 塊需要進行修改才能讀?。?/FONT>

svc.Credentials =
System.Net.CredentialCache.DefaultCredentials;
Console.WriteLine( svc.WhoAmI() );

它允許代理訪問 Web 方法,因為它可以攜帶當前用戶的憑據(jù)并將其提供給質(zhì)詢時的 Web 方法。Web 服務(wù)返回以下結(jié)果:

作為以下用戶運行 : REDMONDsseely

這將同時使用基本和簡要身份驗證。身份驗證信息只對一個 Web 服務(wù)調(diào)用有效。換句話說,Web 服務(wù)代碼不能調(diào)用其他 Web 服務(wù),不能使用這些機制扮演調(diào)用者。請記住,如果您選擇基本身份驗證,則還應(yīng)該為該文件請求一個 SSL 連接,以避免用戶的身份被泄漏給監(jiān)視連接的實體。有時,您可能需要使用不同于當前用戶的身份標識來訪問 Web 服務(wù)。那該怎么做呢?您可以“手動”設(shè)置憑據(jù)。

假設(shè)在本地 Web 服務(wù)器 sseely2 上有一個用戶名為 Example,其密碼為 Test$123。要手動設(shè)置憑據(jù),必須創(chuàng)建一個 CredentialCache。使用 CredentialCache 的代碼需要使用 NetworkCredential 對象填充高速緩存。當向高速緩存添加 NetworkCredential 時,代碼需要指定返回指定憑據(jù)時所使用的 URL/身份驗證組合類型。有可能使用多個站點的標識信息來填寫高速緩存,并使高速緩存針對各站點和身份驗證類型智能地返回正確的憑據(jù)。要將高速緩存設(shè)置為針對來自 Web 服務(wù)的基本身份驗證質(zhì)詢發(fā)送正確的憑據(jù),請使用以下代碼:

localhost.Sample svc = new localhost.Sample(); try { CredentialCache credCache = new CredentialCache(); NetworkCredential netCred = new NetworkCredential( "Example", "Test$123", "sseely2" ); credCache.Add( new Uri(svc.Url), "Basic", netCred ); svc.Credentials = credCache; Console.WriteLine( svc.WhoAmI() );

當在 URL 中傳遞,以在包含 credCache.Add 的行上使用時,您會發(fā)現(xiàn) URL 是從 Web 服務(wù)中得到的,而不是被硬編碼或從其他源獲取的。我喜歡用這種方法將調(diào)用編寫到 Add 方法中,因為這樣最省事,又可以保證 Web 服務(wù)端點和調(diào)用 Add 所使用的端點相同。

如果您想為簡要身份驗證使用相同的憑據(jù),則向憑據(jù)高速緩存添加信息的行將讀?。?/FONT>

credCache.Add( new Uri(svc.Url), "Digest", netCred );

基本身份驗證將對在本地計算機注冊或在目錄中注冊的用戶起作用。簡要身份驗證只接受在信任的 Windows 域中注冊的用戶。

另一種驗證 Web 服務(wù)調(diào)用者的方法是通過 SSL 執(zhí)行相互身份驗證。SOAP 消息的發(fā)送者和接收者可以交換證書并互相驗證。服務(wù)器如果具有 SSL 功能,則將具有證書。如果以相同的形式向客戶端簽發(fā)了證書,則客戶端也將具有證書。如果您已經(jīng)具有一個證書服務(wù)器,您需要給自己簽發(fā)一個證書,然后通過圖 2 所示的對話框?qū)⒆C書映射到您的用戶帳戶中。

如果您確實有可用的證書,則可以通過控制面板中的“Internet 選項”小程序訪問這些證書。訪問此小程序的最簡便的方法是通過 Microsoft? Internet Explorer。如果您沒有安裝證書,而現(xiàn)在想獲取一個。只需打開 Internet Explorer,瀏覽到已安裝證書服務(wù)器的 Windows 服務(wù)器。您所需的 URL 為 http://machine_name/certsrv。按照屏幕上的說明來請求和安裝客戶證書。下一步,在 Internet Explorer 的“工具”菜單中,單擊“Internet 選項”,單擊“內(nèi)容”選項卡,然后單擊“證書”。將顯示一個與圖 5 類似的對話框。

 

圖 5:“證書”對話框

您需要導出一個證書,以便可以被 Web 服務(wù)代理身份驗證使用。要導出證書,請單擊“導出”打開“證書導出向?qū)А?。在向?qū)е校瑔螕簟跋乱徊健苯邮芩心J選項,然后選擇一個寫入證書的文件名。在我的示例中,我將證書保存到 c:tempsecSample.cer 中。單擊“下一步”,然后單擊“完成”。現(xiàn)在,我們需要將該證書與某個特定用戶關(guān)聯(lián)起來。

重復執(zhí)行請求 SSL 所需的步驟,以確保一個或所有 Web 服務(wù)的安全。

選擇“啟用客戶證書映射”復選框,并單擊“編輯”。

在“一對一映射”選項卡上,單擊“添加”。

選擇 c:tempsecSample.cer

在“映射到帳戶”對話框中,設(shè)置以下各項:

“映射名”:HTTP 示例映射

“帳戶”:選擇一個用戶帳戶。在我的示例中,我選擇的是 sseely2Example。

“密碼”:映射到帳戶密碼。在我的示例中,我輸入的是 Test$123。

如果證書身份和與證書關(guān)聯(lián)的身份不匹配,那沒有關(guān)系。將證書匹配到身份標識時,服務(wù)器只在存儲區(qū)中查找與接收到的證書完全匹配的另一個證書。為什么是這樣呢?個人也可能具有由公共證書頒發(fā)機構(gòu)簽發(fā)的客戶證書。使用 SSL 客戶身份驗證時,服務(wù)器可以將證書映射到主機中的某個身份標識,而不需要與證書頒發(fā)者以任何方式發(fā)生關(guān)聯(lián)。   

單擊以確認密碼,再單擊三次“確定”關(guān)閉對話框。
  
現(xiàn)在,您需要在 IIS 中設(shè)置其他選項。首先需要清除所有可用的身份驗證方法,以確保受保護的資源(.asmx 文件或虛擬目錄)具有圖 6 所示的權(quán)限設(shè)置。

 

圖 6:所有身份驗證方法都被清除

然后,需要客戶證書,如圖 7 所示。

圖 7:需要 SSL 和客戶證書

最后,需要對客戶端進行配置,以從文件加載證書并提交給 Web 服務(wù)。System.Security.Cryptography.X509Certificates.X509Certificate 類知道如何讀取 X.509 證書。要加載證書并使其可以被 Web 服務(wù)使用,請讀入證書,并將其添加到代理的客戶證書集合中。

static void Main(string[] args) { localhost.Sample svc = new localhost.Sample(); try { X509Certificate x509 = X509Certificate.CreateFromCertFile( @"c:tempsecSample.cer"); svc.ClientCertificates.Add( x509 ); Console.WriteLine( svc.WhoAmI() ); } catch ( Exception ex ) { Console.WriteLine( ex.ToString() ); } finally { svc.Dispose(); } }

正如所料,輸出為:

作為以下用戶運行 : SSEELY2example

使用基本/簡要身份驗證或 X.509 驗證用戶身份時,您也可以使用訪問控制列表 (ACL) 來確定那些用戶可以訪問目錄。一種查看文件或目錄的 ACL 的方法是使用 Windows 資源管理器。右鍵單擊文件,然后單擊“屬性”。在“安全性”選項卡中,您可以添加或刪除用戶和用戶組,也可以對這些用戶操作文件的權(quán)限進行管理。

您并不是任何時候都希望將 Web 服務(wù)的用戶添加到 Active Directory。相反,將這些信息保存在別處可能更可取。要解決此問題,通常使用下面兩種方法:第一種方法常用于安全 Web 站點,是向每個用戶簽發(fā)一個用戶名和密碼,然后通過 SOAP 信息頭和其他機制傳遞這些憑據(jù)。Cold Storage 示例使用自定義 SOAP 信息頭和 HTTP 模塊來提供身份驗證。另一種方法是創(chuàng)建一個自定義登錄 Web 服務(wù)。此處,調(diào)用者通過 SSL 等安全通道登錄,并接收一個令牌以在調(diào)用 Web 服務(wù)上的其他方法時使用。

使用代碼訪問安全性

迄今為止,我們只討論了唯一識別用戶的方法。一旦我們知道用戶是誰,我們就可以使用這些信息來授權(quán)用戶訪問 Web 服務(wù)內(nèi)的一種或多種方法。示例用戶是 sseely2SampleGroup 組的成員。如果我想將對 WhoAmI Web 方法的訪問權(quán)限限制在該組成員范圍內(nèi),則可以應(yīng)用 System.Security.Permissions.PrincipalPermissionAttribute 屬性。具體來說,我將使用以下代碼:

[WebMethod]
[PrincipalPermissionAttribute(SecurityAction.Demand,
Authenticated=true,
Name=@"sseely2Example",
Role=@"sseely2SampleGroup")]
public string WhoAmI() {
return "作為以下用戶運行: " +
Thread.CurrentPrincipal.Identity.Name;
}

上面的代碼有點極端。它要求知道調(diào)用者的 ID,要求調(diào)用者屬于 sseely2SampleGroup 組并且調(diào)用者的名稱為 sseely2Example。更常見的情況是要求成員屬于某個特定組。這種技術(shù)提供了一種準予或拒絕訪問特定 Web 方法的簡單方法。使用代碼訪問安全性 - 當保護 .asmx 級的訪問時,使用訪問控制列表是不夠的。   互操作性

如果在前面關(guān)于安全保護機制的論述中我沒有提到互操作性的話,可能是我疏忽了。如果您想使用非 Microsoft 工具包來訪問您的 Web 服務(wù),那么,最具互操作性且經(jīng)過良好測試的安全機制是使用基本身份驗證來識別調(diào)用者和 SSL 的身份以加密通道。將此機制與集成 Windows 身份驗證配合使用時,您需要向 Web 服務(wù)器用戶或相應(yīng)的 Windows 域控制器添加用戶名和密碼。原因很簡單:許多 Web 服務(wù)堆棧不包括理解如何處理簡要身份驗證的 HTTP 部分。許多情況下,SSL/SOAP 組合可能不支持發(fā)送客戶端 X.509 證書。

小結(jié)
  
您可以結(jié)合使用 IIS 和 ASP.NET 中的功能來確保 Web 服務(wù)的安全。ASP.NET Web 服務(wù)使用一個憑據(jù)式高速緩存來響應(yīng)各種類型的身份驗證請求?;?簡要身份驗證和 SSL 都具有相同的缺點:

它們要求在安全地發(fā)送消息之前在 SOAP 消息發(fā)送者和接收者之間交換消息。此握手機制會限制 SOAP 消息傳輸?shù)乃俣?。提高速度正?WS-Security 規(guī)范的動機之一。WS-Security 放棄了以消息為中心的安全保護模式的傳輸協(xié)議技術(shù)。在 WS-Security 被廣泛理解和部署之前,基于 HTTP 的安全機制是保證 Web 服務(wù)安全的最好方法。

發(fā)布:2007-03-25 10:37    編輯:泛普軟件 · xiaona    [打印此頁]    [關(guān)閉]
相關(guān)文章:
上海OA系統(tǒng)
聯(lián)系方式

成都公司:成都市成華區(qū)建設(shè)南路160號1層9號

重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓

咨詢:400-8352-114

加微信,免費獲取試用系統(tǒng)

QQ在線咨詢