在一些 Web 系統中,身份驗證是依靠硬件證書進行的:在電腦上插入 USB 證書,瀏覽器插件讀取證書的相關信息,而後在發送 HTTP 登陸請求時順便在 Header 字段附加上身份信息。服務器端處理這樣的登陸請求的思路也很簡單,就是讀取 HTTP Header 相關信息,而後進行相應的處理。html
在 ASP.Net MVC 架構的網站中,天然也可使用這樣的機制,下面基於 Visual Studio 2012 演示一下操做步驟。瀏覽器
首先創建一個ASP.Net MVC 4 項目。服務器
選擇模板的時候,保留默認值便可。架構
系統已經按照預設的模板創建了一些文件,以下圖所示。網站
由於咱們須要修改的是登陸的邏輯,因此打開 AccountController.cs。與用戶登陸相關的默認代碼以下所示。this
public ActionResult Login(LoginModel model, string returnUrl) { if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe)) { return RedirectToLocal(returnUrl); } // 若是咱們進行到這一步時某個地方出錯,則從新顯示錶單 ModelState.AddModelError("", "提供的用戶名或密碼不正確。"); return View(model); }
對其進行以下的修改。spa
public ActionResult Login(LoginModel model, string returnUrl) { for (int i = 0; i < HttpContext.Request.Headers.Count; i++) { string key = HttpContext.Request.Headers.GetKey(i); string value = HttpContext.Request.Headers.GetValues(i)[0]; // In the HTTP header, we find a key "Connection" with value "Keep-Alive". // We can use the key as the username, and the value as the password if (key == "Connection") { if (ModelState.IsValid) { if (WebSecurity.Login(key, value, persistCookie: model.RememberMe)) { return RedirectToLocal(returnUrl); } } ModelState.AddModelError("", "提供的用戶名或密碼不正確。"); return View(model); } } // In this case, we have overridden the username and password user enters. // So code below can be removed. if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe)) { return RedirectToLocal(returnUrl); } ModelState.AddModelError("", "提供的用戶名或密碼不正確。"); return View(model); }
這樣代碼的修改就完成了。正如上面註釋所說,咱們準備用 HTTP Header 中原本就有的一項 Connection 做爲用戶名,其值 Keep-Alive 做爲密碼。可是爲了可以登陸,首先要註冊這個用戶。插件
註冊成功後,系統會自動幫你登陸。爲了檢驗剛纔的修改,首先註銷,而後從新打開登陸頁面,直接點擊登錄。code
咦?模板還自帶了 JavaScript 的基本監測,因此不能什麼都不填就登陸。咱們隨便填一點。htm
而後點擊登錄。
按照咱們的預期,服務器截取了 HTTP Header 中的相關字段做爲用戶名和密碼,登陸成功。
本文展現了 ASP.Net MVC 下基於 HTTP Header 登陸的基本思路,可是還有很多其它工做須要作,接下來就請大家繼續了。