在前一篇文章ASP.NET Web API(一):使用初探,GET和POST資料中,我們初步接觸了微軟的REST API: Web API。
我們在接觸了Web API的後就立馬發現了有安全驗證的需求,所以這篇文章我們先來討論下 安全驗證一個最簡單的方法:使用HTTP基本認證。
HTTP基本認證原理
在HTTP協議進行通訊的過 程中,HTTP協議定義了基本認證過程以允許HTTP伺服器對WEB瀏覽器進行使用者身份認證的方法,當一個用戶端 向HTTP伺服器進行資料請求時,如果用戶端未被認證,則HTTP伺服器將通過基本認證過程對用戶端的使用者名稱及 密碼進行驗證,以決定使用者是否合法。
其基本的實現方式是:
用戶端在使用者輸入使用者名稱及密碼 後,將使用者名稱及密碼以BASE64加密,加密後的密文將附加於請求資訊中,如當使用者名稱為Parry,密碼為123456 時,用戶端將使用者名稱和密碼用":"合并,並將合并後的字串用BASE64加密,並於每次請求資料時 ,將密文附加於要求標頭(Request Header)中。
HTTP伺服器在每次收到請求包後,根據協議取得客戶 端附加的使用者資訊(BASE64加密的使用者名稱和密碼),解開請求包,對使用者名稱及密碼進行驗證,如果使用者名稱及密 碼正確,則根據用戶端請求,返回用戶端所需要的資料;否則,返回錯誤碼或重新要求用戶端提供使用者名稱及 密碼。
Web API使用HTTP基本認證進行安全驗證
我們還是基於前一篇文章的樣本進行測試。
首先我 們基於System.Web.Http.AuthorizeAttribute類實現一個HTTP基本認證的類,並實現兩個方法: OnAuthorization和HandleUnauthorizedRequest。
添加一個類HTTPBasicAuthorizeAttribute,繼承於 System.Web.Http.AuthorizeAttribute,先來實現OnAuthorization。
public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext) { if (actionContext.Request.Headers.Authorization != null) { string userInfo = Encoding.Default.GetString(Convert.FromBase64String(actionContext.Request.Headers.Authorization.Parameter)); //使用者驗證邏輯 if (string.Equals(userInfo, string.Format("{0}:{1}", "Parry", "123456"))) { IsAuthorized(actionContext); } else { HandleUnauthorizedRequest(actionContext); } } else { HandleUnauthorizedRequest(actionContext); } }