在一些 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 登錄的基本思路,但是還有不少其它工作需要做,接下來就請你們繼續了。







