在一些 Web 系統中,身份驗證是依靠硬件證書進行的:在電腦上插入 USB 證書,瀏覽器插件讀取證書的相關信息,然后在發送 HTTP 登錄請求時順便在 Header 字段附加上身份信息。服務器端處理這樣的登錄請求的思路也很簡單,就是讀取 HTTP Header 相關信息,然后進行相應的處理。
在 ASP.Net MVC 架構的網站中,自然也可以使用這樣的機制,下面基於 Visual Studio 2012 演示一下操作步驟。
首先建立一個ASP.Net MVC 4 項目。
選擇模板的時候,保留默認值即可。
系統已經按照預設的模板建立了一些文件,如下圖所示。
因為我們需要修改的是登錄的邏輯,所以打開 AccountController.cs。與用戶登錄相關的默認代碼如下所示。
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); }
對其進行如下的修改。
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 作為密碼。但是為了能夠登錄,首先要注冊這個用戶。
注冊成功后,系統會自動幫你登錄。為了檢驗剛才的修改,首先注銷,然后重新打開登錄頁面,直接點擊登陸。
咦?模板還自帶了 JavaScript 的基本監測,所以不能什么都不填就登錄。我們隨便填一點。
然后點擊登陸。
按照我們的預期,服務器截取了 HTTP Header 中的相關字段作為用戶名和密碼,登錄成功。
本文展示了 ASP.Net MVC 下基於 HTTP Header 登錄的基本思路,但是還有不少其它工作需要做,接下來就請你們繼續了。