在一些 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 登陆的基本思路,可是还有很多其它工做须要作,接下来就请大家继续了。