在.net中保證WebService的通信安全

 

轉載自 http://blog.csdn.net/firewolffeng/article/details/2310187數據庫

Web Service如今是很通用的技術,在Web Service咱們須要驗證用戶是否有使用此Web Service的權限,而且要保證在通信過程當中的數據安全,防止數據在傳輸過程當中被網絡竊聽。windows

首先是如何保證Web Service被受權使用,在這裏我說的是經過SoapHeader來判斷調用Web服務的用戶。瀏覽器

1.定義一個安全上下文,而且繼承於SoapHeader類安全

public   class  SecurityContext : SoapHeader
{
    
public string UserID;
    
public string Password;
}

UserID是定義的用戶名,Password是密碼,固然這個UserID和密碼是能夠經過數據庫得到的,在這裏,咱們固定這兩個變量的值服務器

2.在Web Service中定義一個公開的變量,類型是SecurityContext網絡

public  SecurityContext m_SecurityContext;

3.定義一個校驗用戶名和密碼的方法ide

 

private   bool  ValidateUser()
    
{
        
if (m_SecurityContext == null)
        
{
            
throw new Exception("沒有指定用戶名和密碼");
        }

        
        
//這裏能夠直接訪問數據庫來驗證密碼
        if (m_SecurityContext.UserID.ToLower() == (new AppSettingsReader()).GetValue("DTUser"typeof(string)).ToString().ToLower()
            
&& m_SecurityContext.Password == (string)(new AppSettingsReader()).GetValue("DTPassword"typeof(string)))
        
{
            
return true;
        }

        
else
        
{
            
return false;
        }

    }

4.在公開的,提供給客戶調用的Web Service方法裏調用校驗的方法,如函數

[WebMethod]
    [SoapHeader(
" m_SecurityContext " )]
    
public  DataSet GetChangedDepts( string  DeptCode)
    
{
        
if (!ValidateUser())
        
{
            
return null;
        }

       
        
return m_ServiceAll.GetChangedDepts(DeptCode);
    }

5.在調用方制定用戶名和密碼工具

// 實例化Web Service
MyWebService service  =   new  MyWebService();
// 實例化SoapHeader(用戶上下文)
service.SecurityContextValue  =  localhost.SecurityContext();
// 指定用戶名和密碼
service.SecurityContextValue.UserID  =   " 張三 " ;
service.SecurityContextValue.Password 
=   " 12345 " ;

在指定完用戶名和密碼後才能調用Web Service的方法網站

上面所說的是如何保證Web Service的受權使用,可是在實際使用中,客戶端傳輸到Web Service的用戶名和密碼都是以須要進行加密。由於Http的數據傳輸是以明文方式進行傳輸的,若是不加密,極可能被偵聽到數據的傳輸而獲得調用Web Service的用戶名和密碼。咱們這裏所說的是採用SSL的加密方式來調用Web Service.

 1.首先咱們須要配置一個SSL站點

要想爲某個IIS網站建立數字證書,首先必須使用「Web服務器證書嚮導」 功能爲該網站生成一個證書請求文件。進入控制面板管理工具→Internet 信息服務(IIS)管理器,在IIS管理器窗口中展開網站目錄,右鍵點擊要使用SSL安全加密機制功能的網站,在彈出菜單中選擇屬性,而後切換到目錄安全性標籤頁(如圖),接着點擊服務器證書按鈕。在「IIS證書嚮導窗口中選擇新建證書選項,點擊下一步,選中如今準備證書請求,但稍後發送,接着在名稱欄中爲該證書起個名字,在位長下拉列表中選擇密鑰的位長,這裏要注意,位長不能設置的過大,不然會影響通訊質量;接着設置證書的單位、部門、和地理信息,在站點公用名稱欄中輸入該網站的域名,而後指定證書請求文件的保存位置,這裏筆者將該證書請求文本文件保存在「d:/certreq.txt」。這樣就完成了證書請求文件的生成。

 完成了證書請求文件的生成後,就能夠開始申請IIS網站證書了。但這個過程須要證書服務(Certificate Services)的支持。Windows 2003系統默認狀態沒安裝此服務,須要手工添加。

  安裝證書服務

  在控制面板中運行添加或刪除程序,切換到添加/刪除Windows組件頁,在「Windows組件嚮導對話框中,選中證書服務選項,接下來選擇CA類型,這裏筆者選擇獨立根CA」,而後爲該CA服務器起個名字,設置證書的有效期限,建議使用默認值「5便可,最後指定證書數據庫和證書數據庫日誌的位置後,就完成了證書服務的安裝。

完成了證書服務的安裝後,就能開始申請IIS網站證書了。運行 Internet Explorer瀏覽器,在地址欄中輸入「http://localhost/CertSrv/default.asp」。接着在「Microsoft 證書服務歡迎窗口中點擊申請一個證書連接,而後在證書申請類型中點擊高級證書申請連接,在高級證書申請窗口中點擊使用BASE64編碼的 CMCPKCS#10文件提交….」連接,接着將證書請求文件的內容複製到保存的申請輸入框中,這裏筆者的證書請求文件內容保存在「d:/ certreq.txt」,最後點擊提交按鈕。

  這個語句指定了遠程證書校驗的回調函數。在指定了遠程證書校驗的回調函數後,就能夠開始實例化WebService

雖然完成了 IIS 網站證書的申請後,但這時它還處於掛起狀態,須要頒發後才能生效。在 控制面板 管理工具 中,運行 證書頒發機構 程序。在 證書頒發機構 左側窗口中展開目錄,選中 掛起的申請 目錄,在右側窗口找到剛纔申請的證書,鼠標右鍵點擊該證書,選擇 全部任務 頒發

 接着點擊 「頒發的證書目錄,打開剛剛頒發成功的證書,在 「證書對話框中切換到詳細信息標籤頁。點擊複製到文件按鈕,彈出證書導出對話框,一路下一步,在要導出的文件欄中指定文件名,這裏筆者保存證書路爲爲「d:/cce.cer」,最後點擊完成

 在IIS管理器的目錄安全性標籤頁中,點擊服務器證書按鈕,這時彈出掛起的證書請求對話框,選擇處理掛起的請求並安裝證書選項,點擊下一步後,指定好剛纔導出的IIS 網站證書文件的位置,接着指定SSL使用的端口,建議使用默認的「443」,最後點擊完成按鈕.

 完成了證書的導入後,IIS網站這時尚未啓用SSL安全加密功能,須要對IIS服務器進行配置。

  選擇須要加密訪問的站點目錄(若是但願全站加密,能夠選擇整個站點),右鍵單擊打開屬性頁,在目錄安全性標籤頁,點擊安全通訊欄的編輯按鈕,選中要求安全通道(SSL)」要求128位加密選項,最後點擊肯定按鈕便可。若是須要用戶證書認證等高級功能,也能夠選擇要示客戶證書選擇,還能夠把特定證書映射爲windows用戶賬戶。

咱們如今就配置好了一個帶SSL的虛擬目錄,將咱們的WebService放入這個虛擬目錄中,咱們訪問WebService時會彈出一個對話框要求咱們確認證書。那麼咱們使用怎樣的方式能夠用代碼來調用使用SSL加密的WebService呢?

1.首先在調用的代碼裏定義一個靜態的方法

  private   static   bool  CheckValidationResult( object  sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        
{   //   Always   accept   
            return true;
        }

這個方法老是返回true是用於忽略客戶端證書時使用,若是要使用客戶端證書,可能會用到中間兩個參數,這裏我沒有研究,你們能夠研究一下

2.在調用方初始化時加入下面的代碼

ServicePointManager.ServerCertificateValidationCallback  =   new  RemoteCertificateValidationCallback(CheckValidationResult);

 

上面所說的給你們拋磚引玉,經過SoapHeader來保證WebService的受權使用,經過SSL來保證數據的加密,防止網絡偵聽

相關文章
相關標籤/搜索