zoukankan      html  css  js  c++  java
  • ASP.NET的MVC中使用Cookie做身份验证(附代码下载)

    场景

    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添加登录窗体与测试登录后=访问的链接

    <div class="row">
        <div class="col-md-12">
            @using (Html.BeginForm("Login", "Home"))
            {
                <input type="text" name="account" class="form-control" />
                @Html.Password("password", null, new { @class = "form-control" })
                <button>登录</button>
            }
        </div>
    </div>
    <a href="@Url.Action("test")" class="btn btn-block btn-success">登录后才能进入</a>

    为了访问此登录后的链接,打开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

  • 相关阅读:
    spring -项目功能介绍
    【HQL】分页查询 、对象导航查询、外置命名查询、连接查询、查询过滤器、统计查询
    【HQL】属性查询、条件查询
    【HQL】hibernate查询语言hql
    Hibernate- 表联系
    struts 配置过程 -一个计算器程序
    【DRP】-JSTL核心库 c:out标签
    .NET 使用sock5做代理(不是搭建服务端)
    重磅新闻!昨日阿里云发布首款云电脑“无影”,到底如何呢?
    C#如何实现获取电脑硬件相关的配置信息呢?
  • 原文地址:https://www.cnblogs.com/badaoliumangqizhi/p/13261155.html
Copyright © 2011-2022 走看看