在前一篇文章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); } }