DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> 構建安全的Xml Web Service系列(一)
構建安全的Xml Web Service系列(一)
編輯:XML詳解     
Xml Web Service 從誕生那天就說自己都麼都麼好,還津津樂道的說internet也會因此而進入一個新紀元,可5年多來,Xml Web Service並沒有像當初宣揚的那樣火起來,盡管在一些領域之內,也有人牛刀小試,但從整體而言,Service還並沒有得到廣泛的應用,原因有很多,有一些來源於目前各大廠商都堅持自己的service標准,不能形成統一,也有對現有的穩定系統不願進行更改的原因,但還包括web service本身的原因,最明顯的應該是兩個:1) 安全,2)性能。畢業設計的時候,寫的是高性能web service的開發和應用,下面,我想用幾篇文章來闡述一下有關XML web service安全的幾個解決方案。歡迎各位大蝦來砸。

  如何解決網絡服務的安全問題,我主要從以下兩個層面進行分析:

  1) 確保調用者的合法身份-保證來源的合法

  2) 在傳輸中不被非法監聽和篡改。

  當然還會有其他方面的安全隱患,希望大家能多多提出,我也好能進一步總結。

  如果您想更快的掌握本文提到的技術,您以前必須了解xml web service的工作原理,並且親自開發並部署或者使用過Xml web service,只是您並不相信您部署的XML web service是安全的。

  本節先介紹一種最為簡單的確保調用者合法的解決方案-將用戶名和密碼附加在Soap消息頭部,在服務器端進行用戶名密碼驗證。這種方式從解決了原網絡服務不能針對特定對象產生響應的問題。但因為仍以明文格式

  傳輸,所以不能有效地防止信息在傳輸過程中被偷窺,篡改或偽造。

  如果您以前已經使用了這種方法,請略過此篇文章,我下篇文章中將講述其他方式,更加合理的解決方案,歡迎您繼續關注。

  下面是實現此種解決方案的步驟,請您一步一步來

  第一步:首先您需要創建一個XML Web Service的服務項目,創建方法如下

  打開visual studio 2005,在起始頁上點擊創建項目,選擇visual C#中的ASP.Net web 服務應用程序,輸入項目名稱

  第二步:在該項目中創建一個擴展的SoapHeader對象MySoapHeader,如下

以下是引用片段:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Web.Services.Protocols;

namespace WebService1
{
    public class MySoapHeader:SoapHeader
    {
        private string _userName;
        private string _pwd;
        /**//// <summary>
        /// 用戶名
        /// </summary>
        public string UserName
        {
            get
            {
                return _userName;
            }
set
            {
                _userName = value;
            }
        }
        /**//// <summary>
        /// 密碼
        /// </summary>
        public string Pwd
        {
            get
            {
                return _pwd;
            }
            set
            {
                _pwd = value;

            }
        }
    }
}

  第三步:創建一個XML Web Service,另添加一個要求使用SoapHeader的網絡服務方法

以下是引用片段:

using System;
using System.Data;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.ComponentModel;

namespace WebService1
{
    /**//// <summary>
    /// Service1 的摘要說明
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [ToolboxItem(false)]
    public class Service1 : System.Web.Services.WebService
    {
        public MySoapHeader header = new MySoapHeader();       
        [WebMethod]
        [SoapHeader("header")]      

public string HelloWorld()
        {
            if (header == null)
            {
                return "您沒有設置SoapHeader,不能正常訪問此服務!";
            }
            if (header.UserName != "jillzhang" header.Pwd != "123456")
            {
                return "您提供的身份驗證信息有誤,不能正常訪問此服務!";
            }
            return "Hello World";
        }
    }
}

  第四步:創建一個調用XML Web Service的Console應用程序,如下:

以下是引用片段:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
      
        static void Main(string[] args)
        {
            localhost.Service1 ws = new ConsoleApplication1.localhost.Service1();
            //ws.MySoapHeaderValue = new ConsoleApplication1.localhost.MySoapHeader();
            //ws.MySoapHeaderValue.UserName = "jillzhang";
            //ws.MySoapHeaderValue.Pwd = "123456";
            Console.WriteLine(ws.HelloWorld());
        }
    }
}

  下面的分析,對於大家來說,應該是最重要的,很多人不清楚SoapHeader的工作原理,為什麼這麼怪異的寫法竟能產生神奇的效果,下面我將不同情形下的Soap消息解析出來,大家仔細觀察這個信息,並可以清晰地掌握了SoapHeader的工作原理了.

  首先,先看看沒有設置SoapHeader的情況下,Soap消息為:

以下是引用片段:

-----Soap請求 在 2007年05月22日 12時39分40秒
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><HelloWorld XMLns="http://tempuri.org/" /></soap:Body></soap:Envelope>

-----Soap響應 在 2007年05月22日 12時39分40秒
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><HelloWorldResponse XMLns="http://tempuri.org/"><HelloWorldResult>您提供的身份驗證信息有誤,不能正常訪問此服務!</HelloWorldResult></HelloWorldResponse></soap:Body></soap:Envelope>

  再看看在設置了SoapHeader之後的Soap的請求和響應信息

以下是引用片段:

-----Soap請求 在 2007年05月22日 12時42分20秒
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Header><MySoapHeader xmlns="http://tempuri.org/"><UserName>jillzhang</UserName><Pwd>123456</Pwd></MySoapHeader></soap:Header><soap:Body><HelloWorld XMLns="http://tempuri.org/" /></soap:Body></soap:Envelope>

-----Soap響應 在 2007年05月22日 12時42分20秒
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><HelloWorldResponse XMLns="http://tempuri.org/"><HelloWorldResult>Hello World</HelloWorldResult></HelloWorldResponse></soap:Body></soap:Envelope>


  點正是通過這個節點,SoapMessage將信息傳遞給了網絡服務端,網絡服務端便可以從中解析出來,並加以處理,從上面的SoapMessage中,我們也看出,用戶名和密碼是以明文的格式傳輸的,這樣,SoapHeader就更像Http協議中的Cookie了,我們可以參考CookIE的使用,來擴展SoapHeader,讓它變得更加安全些,但總的看來,通過直接設置SoapHeader的方法提高安全性還是有一定限制的。在安全不是特別重要的應用情形中,推薦采用此種解決方案,因為它方便快捷,靈活易用。

  下一節,我將介紹一下,如何獲取SoapMessage.

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved