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

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

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

咨詢:400-8352-114

加微信,免費獲取試用系統

QQ在線咨詢

上海OA快博

當前位置:工程項目OA系統 > 泛普各地 > 上海OA系統 > 上海OA快博

HTTP安全性和ASP.NET Web服務

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

AMTeam.org

HTTP安全性和ASP.NET Web服務

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

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

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

保密使偵聽對話的實體不能直接看到數據。

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

身份驗證回答“調用者是誰”的問題。

授權回答“調用者是否有權訪問該 Web 方法”的問題。

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

使用 SSL 進行加密和簽名
  
任何時候當您需要對基于 HTTP 的 SOAP 消息進行保密時,都應該通過 SSL 運行服務。它將對通過線路查看數據傳輸的實體隱藏 Web 服務中的數據。

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

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

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

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

單擊“確定”。

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

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

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

 

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

 

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

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

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

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

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

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

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

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

 

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

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

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

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

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

搜索調用者。

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

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

我們將修改一個調用該 Web 服務的簡單的控制臺應用程序。開始時,客戶端如下所示:

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 服務/應用程序應用安全保護,Main 函數將打印以下信息:

 

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

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

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

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

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

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

作為以下用戶運行 : REDMONDsseely

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

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

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ā)現 URL 是從 Web 服務中得到的,而不是被硬編碼或從其他源獲取的。我喜歡用這種方法將調用編寫到 Add 方法中,因為這樣最省事,又可以保證 Web 服務端點和調用 Add 所使用的端點相同。

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

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

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

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

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

 

圖 5:“證書”對話框

您需要導出一個證書,以便可以被 Web 服務代理身份驗證使用。要導出證書,請單擊“導出”打開“證書導出向導”。在向導中,單擊“下一步”接受所有默認選項,然后選擇一個寫入證書的文件名。在我的示例中,我將證書保存到 c:tempsecSample.cer 中。單擊“下一步”,然后單擊“完成”?,F在,我們需要將該證書與某個特定用戶關聯起來。

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

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

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

選擇 c:tempsecSample.cer

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

“映射名”:HTTP 示例映射

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

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

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

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

 

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

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

圖 7:需要 SSL 和客戶證書

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

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 資源管理器。右鍵單擊文件,然后單擊“屬性”。在“安全性”選項卡中,您可以添加或刪除用戶和用戶組,也可以對這些用戶操作文件的權限進行管理。

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

使用代碼訪問安全性

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

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

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

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

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

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

發(fā)布:2025-09-18 13:23    編輯:泛普軟件 · xiaona    [打印此頁]    [關閉]