• C# ASP.NET Forms身份认证


    原文:https://www.cnblogs.com/kyo-lynn/p/3418577.html

    原文:https://www.cnblogs.com/fish-li/archive/2012/04/15/2450571.html

    注意1:

      1、需要在web.config中添加节点,

      2、需要引用命名空间:System.Web.Security

     注意2:

     注意 票据时间 和 cookie时间
     比如:
      cookie时间为5秒,票据时间为5秒,用户在5秒内刷新,登录时间会一直延续下去,如果超过5秒,登录状态消失
      cookie时间为5秒,票据时间为5000秒,只要登录时间超过5秒,不管用户是否刷新页面,登录状态消失

    1、需要在Web.config中添加节点,添加在system.web下。

    <authentication mode="Forms"></authentication>
            //获取认证信息
            public ActionResult Index()
            {
                if (Request.IsAuthenticated)
                {
                    //获取认证信息
                    //Request.Cookies[FormsAuthentication.FormsCookieName] != null
                    //Request.IsAuthenticated
                    string user = User.Identity.Name;//Request.RequestContext.HttpContext.User.Identity.Name
                    var cookie = Request.Cookies[FormsAuthentication.FormsCookieName];
                    var ticket = FormsAuthentication.Decrypt(cookie.Value);
                    string data = ticket.UserData;
                    return Content($"用户已登录 <br> user:{user} <br> data:{data}");
                }
                return Content("用户未登录");
            }
            //登录1
            public ActionResult Login1()
            {
                FormsAuthentication.SetAuthCookie("name2", true);
                return Content("登录成功,name: name2");
            }
    
            //登录2
            public ActionResult Login2()
            {
                /*
                    判断是否登录的唯一标志,就是 看看 有没有名称为FormsAuthentication.FormsCookieName的cookie,有就是登录了。
    
                    按照asp.net forms验证的设计思想,如果要将自定义数据放到Cookie里面,
                    首先应该定制一个FormsAuthenticationTicket,将自定义数据放到其UserData里,
                    然后用FormsAuthentication.Encrypt加密这个Ticket,
                    最后用new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket)生成一个Cookie,加入到Response.Cookies中, 作为登录标注。
                    并不是直接修改 HttpCookie的Value或者Values。                 
                */
    
                //创建认证信息 Ticket
                FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, "name1", DateTime.Now, DateTime.Now.AddSeconds(5), false, "value1");
    
                //票据加密
                string encryptedTicket = FormsAuthentication.Encrypt(ticket);
    
                //写入到cookie
                var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
                System.Web.HttpContext.Current.Response.SetCookie(cookie);
    
                return Content($"cookie <br> name:{cookie.Name} <br> value:{cookie.Value}");
            }
            //退出
            public ActionResult Logout()
            {
                FormsAuthentication.SignOut();
                return Content("退出成功");
            }

    测试1:用户在5秒内刷新页面,登录状态会一直持续下去

     测试2:不管用户怎么刷新,超过5秒后,就会退出登录状态

    测试3:用户在5秒内刷新页面,登录状态会一直持续下去。超过3秒刷新,用户登录状态消失

    测试1 和 测试3 的区别:

      测试1:票据时间 和 cookie时间 都为5秒

      测试3:票据时间为3秒,cookie时间为5秒

      结论:测试3,就算用户在4秒的时候刷新页面,但那个时间用户从游览器提交的票据,在后台判断是已经失效的,因为票据的过期时间为3秒。

    测试1 和 测试2 的区别:

      测试1:票据时间 和 cookie时间 都为5秒

      测试2:票据时间为5000秒,cookie时间为5秒

      结论:测试2,用户在5秒内刷新页面,游览器有带cookie往服务端请求。

         如果时间超过5秒,游览器请求的时候,就不带cookie。

         这个时候,虽然票据没有过期,但是与票据关联的cookie(应该是票据本身)根本就没有被提交到服务端,

         所以还是为未登陆状态。

    过期时间分为两块:

      1、cookie的过期时间

        cookie的过期时间 决定了 游览器是否会把票据(票据本身就是存在cookie里面的)提交到后台

      2、票据的过期时间

        后台判断过期时间的依据,这个才是实实在在的过期时间。

        如果票据过期了,就算伪造cookie上传票据,也没法通过后台的验证。

    记录一下一些自己的理解

  • 相关阅读:
    六. 异常处理5.多重catch语句的使用
    六. 异常处理4.try和catch的使用
    六. 异常处理3.未被捕获的异常
    六. 异常处理2.异常类型
    对mysql数据库中字段为空的处理
    mysql 中实现多条数据同时更新
    java 用PDFBox 删除 PDF文件中的某一页
    java7 java MethodHandle解析
    【十四】jvm 性能调优实例
    【十三】jvm 性能调优工具之 jstack
  • 原文地址:https://www.cnblogs.com/guxingy/p/10643785.html
Copyright © 2020-2023  润新知