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

來源:互聯網
上載者:User

標籤:style   blog   http   color   io   os   ar   使用   java   

我們在接觸了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)。

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

源碼下載

原始碼下載

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.