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


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

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

首先建立一個ASP.Net MVC 4 項目。

create-proj

選擇模板的時候,保留默認值即可。

create-proj-2

系統已經按照預設的模板建立了一些文件,如下圖所示。

init

因為我們需要修改的是登錄的邏輯,所以打開 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 作為密碼。但是為了能夠登錄,首先要注冊這個用戶。

register

注冊成功后,系統會自動幫你登錄。為了檢驗剛才的修改,首先注銷,然后重新打開登錄頁面,直接點擊登陸。

login-empty

咦?模板還自帶了 JavaScript 的基本監測,所以不能什么都不填就登錄。我們隨便填一點。

login

然后點擊登陸。

login-success

按照我們的預期,服務器截取了 HTTP Header 中的相關字段作為用戶名和密碼,登錄成功。

本文展示了 ASP.Net MVC 下基於 HTTP Header 登錄的基本思路,但是還有不少其它工作需要做,接下來就請你們繼續了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM