场景
ASP.NET的MVC中使用Session做身份验证(附代码下载):
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/107181028
在上面使用Session做身份验证之后,如果网站很热门,那么使用Session就会造成主机非常大的负担。
使用Cookie做身份验证的主要目的是在于降低主机端的负担。
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。
实现
同上在新建项目时选择无身份验证,然后打开HomeController,添加登录的action
public ActionResult Login(string account, string password) { var cookieName = "mvcAuth"; //如果用户名和密码正确 if (account == "mvc" && password == "123456") { //如果已经存在这个cookie则将其删除 if (Response.Cookies.AllKeys.Contains(cookieName)) { var cookieVal = Response.Cookies[cookieName].Value; HttpContext.Application.Remove(cookieVal); Response.Cookies.Remove(cookieName); } //登录成功产生一组cookie var token = Guid.NewGuid().ToString(); //将 token 存放到 Application 內(实际上应该存进数据库) HttpContext.Application[token] = DateTime.UtcNow.AddHours(1); //新建一个Cookie var hc = new HttpCookie(cookieName, token) { //设置此Cookie的过期时间 Expires = DateTime.Now.AddHours(1), //设置Cookie是否可以通过客户端脚本访问 HttpOnly = true }; //将Cookie添加到Cookie集合 Response.Cookies.Add(hc); } //重定向到index return RedirectToAction("Index"); }
上面产生一组GUID后存放至Cookie内,这里使用的是Application对象存放用户登录的时间,实际应该使用数据库。
因为使用Cookie存放数据,而这些数据只有后端程序代码才需要访问,因此强烈建议加上HttpOnly,提高安全性。
再来建立Filters目录,用来存放自定义验证逻辑的类,在此目录下新建类AuthorizePlusAttribute
此类要继承AuthorizeAttribute,并重写方法OnAuthorization
注意要添加命名空间
using System.Web.Mvc;
AuthorizePlusAttribute类代码:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCCookieTest.Filters { public class AuthorizePlusAttribute : AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { //获取Token var token = Convert.ToString(filterContext.HttpContext.Request.Cookies["mvcAuth"].Value); //如果token为空 丢回401 if (string.IsNullOrWhiteSpace(token)) { base.HandleUnauthorizedRequest(filterContext); } //获取登录时间 var loginTime = Convert.ToDateTime(filterContext.HttpContext.Application[token]); //将登录时间与当前的时间进行对比来判断是否为登录状态 if (loginTime > DateTime.UtcNow) { //验证通过 } else { base.HandleUnauthorizedRequest(filterContext); } } } }
然后打开index.cshtml添加登录窗体与测试登录后=访问的链接
class="row">"@Url.Action("test")" class="btn btn-block btn-success">登录后才能进入class="col-md-12"> @using (Html.BeginForm("Login", "Home")) { "text" name="account" class="form-control" /> @Html.Password("password", null, new { @class = "form-control" }) }
为了访问此登录后的链接,打开HomeController,添加test的action
[AuthorizePlus] public ActionResult Test() { return Content("登入成功"); }
使用AuthorizePlus注解需要添加命名空间
using System.Web.Mvc;
然后运行项目,如果没有登录直接点击测试链接后
只有输入正确的用户名mvc和密码123456之后,再点击测试链接
示例代码下载
https://download.csdn.net/download/BADAO_LIUMANG_QIZHI/12584817