[小技巧][ASP.Net MVC Hack] 使用 HTTP 報文中的 Header 字段進行身份驗證

在一些 Web 系統中,身份驗證是依靠硬件證書進行的:在電腦上插入 USB 證書,瀏覽器插件讀取證書的相關信息,而後在發送 HTTP 登陸請求時順便在 Header 字段附加上身份信息。服務器端處理這樣的登陸請求的思路也很簡單,就是讀取 HTTP Header 相關信息,而後進行相應的處理。html

在 ASP.Net MVC 架構的網站中,天然也可使用這樣的機制,下面基於 Visual Studio 2012 演示一下操做步驟。瀏覽器

首先創建一個ASP.Net MVC 4 項目。服務器

create-proj

選擇模板的時候,保留默認值便可。架構

create-proj-2

系統已經按照預設的模板創建了一些文件,以下圖所示。網站

init

由於咱們須要修改的是登陸的邏輯,因此打開 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 做爲密碼。可是爲了可以登陸,首先要註冊這個用戶。插件

register

註冊成功後,系統會自動幫你登陸。爲了檢驗剛纔的修改,首先註銷,而後從新打開登陸頁面,直接點擊登錄。code

login-empty

咦?模板還自帶了 JavaScript 的基本監測,因此不能什麼都不填就登陸。咱們隨便填一點。htm

login

而後點擊登錄。

login-success

按照咱們的預期,服務器截取了 HTTP Header 中的相關字段做爲用戶名和密碼,登陸成功。

本文展現了 ASP.Net MVC 下基於 HTTP Header 登陸的基本思路,可是還有很多其它工做須要作,接下來就請大家繼續了。

相關文章
相關標籤/搜索