[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多做一層的防護。