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


在前一篇文章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。

 1  public  override  void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
 2 {
 3      if (actionContext.Request.Headers.Authorization !=  null)
 4     {
 5          string userInfo = Encoding.Default.GetString(Convert.FromBase64String(actionContext.Request.Headers.Authorization.Parameter));
 6          // 用戶驗證邏輯
 7           if ( string.Equals(userInfo,  string.Format( " {0}:{1} "" Parry "" 123456 ")))
 8         {
 9             IsAuthorized(actionContext);
10         }
11          else
12         {
13             HandleUnauthorizedRequest(actionContext);
14         }
15     }
16      else
17     {
18         HandleUnauthorizedRequest(actionContext);
19     }
20 }

actionContext.Request.Headers.Authorization.Parameter就是Client BASE64后的字符串,我們對其進行反編碼后,為了測試方便只進行簡單的用戶驗證,這里你可以引入自己系統的驗證邏輯。

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

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

完成了此類后,只要在需要啟用HTTP基本認證的Controller的類加上此屬性即可,就像下面這樣。

我們現在來測試驗證過程。

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

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

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

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

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

HTTP基本認證的優缺點

優點是邏輯簡單明了、設置簡單。

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

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

針對這種情況,我們下一篇文章討論下第二種驗證方式:摘要認證(digest authentication)。

覺得文章還行的話就推薦下吧,哈哈。

源碼下載

源代碼下載 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM