ASP.NET WebService(三)_WebService安全機制導入_SoapHeader

接續之前兩篇Web Service的介紹與筆記
 


透過前面第二篇會知道所謂WebService就是寫一個沒有網頁畫面給人家Call的公用Method
也學習到怎麼寫個門戶大開的WebService
門戶大開!!!沒錯仍有不足地方
基於資安考量我們還需要特別有權限控管
不能讓知道Web Service URL的人都可以隨意就進行存取~~~
就跟郵差寄來的郵件一樣
你不希望有人去拆或動自己的郵件一樣
通常會有一層信封的包覆
這個概念就有點類似SOAP本身資料傳送時候的訊息格式
以下是SOAP本身的訊息格式示意圖





這裡介紹透過利用SoapHeader方式來設計具有權限防範的WS程式
通常可能會在Header夾帶一些驗證識別資訊作為一道授權控管手法

Step1.新增一個Class 命名為 MemberSoapHeader
(可能是某個組織或論壇網站的會員、員工、成員....)

使用命名空間using System.Web.Services.Protocols;
並使其繼承SoapHeader


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services.Protocols;

namespace WSApp
{
    public class MemberSoapHeader : SoapHeader
    {
        private string _userName;
        private string _pwd;
        
        public string UserName
        {
            get { return _userName; }
            set { _userName = value; }
        }
        public string Pwd
        {
            get { return _pwd; }
            set { _pwd = value; }
        }
    }
}

Step2.
在WebServices服務類中新增一個public的屬性(必為public),型別設定為剛創建的MemberSoapHeader。在需要使用SoapHeader的WebMethod上添加SoapHeaderAttribute存取屬性[SoapHeader("memberSoapHeader")]此屬性
注意這裡要寫的是屬性的名稱

比如若我們的Web Service方法適用於返回
要消費者付錢或註冊後才能享有的資訊則必須透過驗證使用者帳戶來防範直接訪問URL的缺失




using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;

namespace WSApp
{
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]    
    // [System.Web.Script.Services.ScriptService]
    public class MyService : System.Web.Services.WebService
    {

        public MemberSoapHeader memberSoapHeader;

        [WebMethod]
        [SoapHeader("memberSoapHeader")]
        public string GetFullProductInfo()
        {
            if (memberSoapHeader != null)
            {
                return "this is retVal : " +  memberSoapHeader.UserName;
            }
            return " check not successed ";
        }       
    }
}

如此一來直接訪問時就會顯示沒有通過授權的訊息



在此也可確保Call此Function的一定是透過自己內部系統的程式!!!

這裡示範在Client端我們寫的呼叫端程式方法
使用上一篇介紹的服務參考(.net 3.0以後的便捷方式)
多宣告一個SoapHeader型別 (自定義的)
在呼叫之前指派給自訂WS Class中的SoapHeader屬性
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WSApp
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        MyService myService = new MyService();
        MemberSoapHeader Member = new MemberSoapHeader();        

        protected void Page_Load(object sender, EventArgs e)
        {
            Member.UserName = "Mike";
            Member.Pwd = "123456";
            myService.memberSoapHeader = Member;
            lblWsResult.Text = myService.GetFullProductInfo();
        }
    }
}





以上介紹就達到了 除了能RUN即是福
也一併兼顧到安全性的設計






留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

Architecture(架構) 和 Framework(框架) 有何不同?_軟體設計前的事前規劃的藍圖概念

經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header