[ASP.NET]為WebService多加上認證(SoapHeader)

[ASP.NET]為WebService多加上認證(SoapHeader)

WebService 用來做不同系統之間的整合,是最適合不過的選擇,
但往往忽略了 WebService 被其他不是允許的系統或人拿來參考使用怎麼辦呢?
這邊分享一個簡單的實做,透過在 WebService中加上 SoapHeader  來做認證的機制,
在 WebService Server  端,依照註解序號這六個步驟,來增加認證的機制程式碼

 

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

//1.自行定義的認證所需資料 class
public class Authentication2 : SoapHeader
{
    public string User;
    public string Password;
}

/// <summary>
/// wsTest 的摘要描述
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class wsTest : System.Web.Services.WebService {

    public wsTest () {

        //如果使用設計的元件,請取消註解下行程式碼 
        //InitializeComponent(); 
    }
   //2.宣告認證參數class
   public Authentication2 authentication;

    [WebMethod]
    //3.宣告WebService方法搭配哪一個SoapHeader
    [SoapHeader("authentication2")]
    public bool InsertTable(string userName)
    {
        //5.檢查傳進來的帳號是否正確
        if (IsValidUser())
        {
            //6.執行這個方法的任務
            return true;
        }
        else
        {
            throw new Exception("無法通過認證");
        }
    }

    //4.建立檢查帳號密碼是否正確的方法
    private bool IsValidUser()
    {
        //這段依使用狀況,可以改讀資料庫的帳號密碼或Web.Conifg 等....
        if (authentication.User == "Test01" && authentication.Password == "Test01Password")
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    
}

而呼叫端 Clinet 則增加 5 各步驟的對應程式碼,就能搭配 WebService 端的認證機制 
 

   //1.宣告認證class (命名空間為自行定義的localhost)
        localhost.Authentication2   wsAuthentication  = new Authentication2();
        //2.宣告WebService服務方法
        localhost.wsTest webTest = new wsTest();
        //3.將認證資料加入到認證的class
        wsAuthentication.User = "Test01";
        wsAuthentication.Password = "Test01Password23";
        //4.將認證class給予WebService服務方法內
        webTest.Authentication2Value = wsAuthentication;

        try
        {
            //5.執行
            Response.Write(webTest.InsertTable("aaa"));
        }
        catch(Exception ex)
        {
            Response.Write(ex.Message.ToString());
        }

當沒有認證或認證碼錯誤(上面程式碼中密碼故意打錯),執行程式則會看到,
錯誤訊息為
System.Web.Services.Protocols.SoapException: 伺服器無法處理要求。 ---> System.Exception: 無法通過認證 於 wsTest.InsertTable(String userName) --- 內部例外狀況堆疊追蹤的結尾 ---
 

透過簡單的程式碼宣告,就能做到基本的認證,讓信任的程式來使用WebService,
而要檢驗IP是否為信任的區段的話,在WebService中,則可以使用 Context.Request.UserHostAddress
來取得呼叫端的 IP 是 否為允許的IP檢查。(當然你也可以在IIS設定中設定)
就這樣簡單幾個步驟,就能替WebSerive多做一層的防護。