ASP.NET Web API(二):安全驗證之使用HTTP基本認證

在前一篇文章ASP.NET Web API(一):使用初探,GET和POST數據中,咱們初步接觸了微軟的REST API: Web API。html

咱們在接觸了Web API的後就立馬發現了有安全驗證的需求,因此這篇文章咱們先來討論下安全驗證一個最簡單的方法:使用HTTP基本認證。瀏覽器

HTTP基本認證原理

在HTTP協議進行通訊的過程當中,HTTP協議定義了基本認證過程以容許HTTP服務器對WEB瀏覽器進行用戶身份認證的方法,當一個客戶端向HTTP服務器進行數據請求時,若是客戶端未被認證,則HTTP服務器將經過基本認證過程對客戶端的用戶名及密碼進行驗證,以決定用戶是否合法。安全

其基本的實現方式是:服務器

客戶端在用戶輸入用戶名及密碼後,將用戶名及密碼以BASE64加密,加密後的密文將附加於請求信息中,如當用戶名爲Parry,密碼爲123456時,客戶端將用戶名和密碼用":"合併,並將合併後的字符串用BASE64加密,並於每次請求數據時,將密文附加於請求頭(Request Header)中。ide

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);
    }
}

actionContext.Request.Headers.Authorization.Parameter就是Client BASE64後的字符串,咱們對其進行反編碼後,爲了測試方便只進行簡單的用戶驗證,這裏你能夠引入本身系統的驗證邏輯。spa

同時還要實現HandleUnauthorizedRequest以實現驗證失敗時繼續提示驗證,代碼以下:3d

 protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
 {
     var challengeMessage = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
     challengeMessage.Headers.Add("WWW-Authenticate", "Basic");
     throw new System.Web.Http.HttpResponseException(challengeMessage);
 }

完成了此類後,只要在須要啓用HTTP基本認證的Controller的類加上此屬性便可,就像下面這樣。

咱們如今來測試驗證過程。

當咱們再來請求此API時,就會提示須要輸入用戶名和密碼。

這時使用Fiddler進行抓包查看HTTP Header,就會發現了WWW-Authenticate的頭。

在提供了正確的用戶名和密碼後,咱們發現HTTP已將Parry:123456進行BASE64編碼後的密文添加在了Request Header裏面。

提交後成功地請求到了數據,若是輸入的驗證信息不正確,仍是返回HTTP Status Code爲401的未驗證狀態以繼續驗證。

輸入正確的用戶信息後請求到的數據。

HTTP基本認證的優缺點

優勢是邏輯簡單明瞭、設置簡單。

缺點顯而易見,即便是BASE64後也是可見的明文,很容易被破解、非法利用,使用HTTPS是一個解決方案。

還有就是HTTP是無狀態的,同一客戶端每次都須要驗證。

源碼下載

源代碼下載 

相關文章
相關標籤/搜索