1. public virtual void SignIn(s_User user, bool createPersistentCookie)
  2. {
  3. var now = DateTime.UtcNow.ToLocalTime();
  4.  
  5. //01 实例化一个form表单身份验证票证
  6. //FormsAuthenticationTicket(int version, string name, DateTime issueDate, DateTime expiration, bool isPersistent, string userData, string cookiePath);
  7. var ticket = new FormsAuthenticationTicket(
  8. /*version*/, //票证的版本号
  9. user.Nickname, //用户名
  10. now, //发生时间
  11. now.Add(_expirationTimeSpan), //过期时间,通常用FormsAuthentication.Timeout作默认值
  12. createPersistentCookie, //true存储在cookie,false存储在url,这个用户选择,“记住我”
  13. user.Email, //用户数据,这里只保存了email
  14. FormsAuthentication.FormsCookiePath); //Cookie存放路径,通常用FormsAuthentication.FormsCookiePath作默认值
  15.  
  16. //02 将票证加密成适合cookie保存的字符串
  17. string encryptedTicket = FormsAuthentication.Encrypt(ticket);
  18.  
  19. //03 将加密后的字符串写入cookie
  20. HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
  21. cookie.HttpOnly = true; //不允许客户端脚本访问cookie,仅限http访问
  22. if (ticket.IsPersistent)//如果票证需要持久化,指定cookie过期时间
  23. {
  24. cookie.Expires = ticket.Expiration;
  25. }
  26. //使用https传输此cookie
  27. cookie.Secure = FormsAuthentication.RequireSSL;
  28. cookie.Path = FormsAuthentication.FormsCookiePath;
  29. if (FormsAuthentication.CookieDomain != null)
  30. {
  31. cookie.Domain = FormsAuthentication.CookieDomain;
  32. }
  33.  
  34. _httpContext.Response.Cookies.Add(cookie);
  35. _cachedUser = user;
  36.  
  37. //如果想用默认的方式处理,不写上面那么多:FormsAuthentication.SetAuthCookie(loginName, true);
  38. }
  39.  
  40. //验证当前通过验证的用户
  41. public virtual s_User GetAuthenticatedUser()
  42. {
  43. //如果有缓存的用户,就返回缓存的用户 //如果是基于http会话级的生命周期注入方式,则是可以这样写的
  44. if (_cachedUser != null) return _cachedUser;
  45.  
  46. if (_httpContext == null || //如果httpContext为空
  47. _httpContext.Request == null || // 或httpContext.Request为空 Request.IsAuthenticated为假就返回 空
  48. !_httpContext.Request.IsAuthenticated || // 或或httpContext.Request.IsAuthenticated = false
  49. !(_httpContext.User.Identity is FormsIdentity)) //_httpContext.User.Identity的票证不是 FormsIdentity
  50. {
  51. return null; // 都返回null, 即用户验证失败
  52. }
  53.  
  54. //获取会话中的表单身份验证票证[这个user封装了读cookie,解密cookie,验证转换的过程]
  55. var formsIdentity = (FormsIdentity)_httpContext.User.Identity;
  56.  
  57. //从formsIdentity.Ticket.UserData取email
  58. var userEmail = formsIdentity.Ticket.UserData;
  59.  
  60. //如果email验证失败,则验证失败
  61. if (String.IsNullOrWhiteSpace(userEmail)) return null;
  62.  
  63. //用email去查询数据库,获取user
  64. var user = _userService.GetUserByEmail(userEmail);
  65.  
  66. //如果是合法用户,返回当前合法用户
  67. if (user != null && user.Active ) _cachedUser = user;
  68. return user;
  69. }
  70.  
  71. public virtual void SignOut()
  72. {
  73. _cachedUser = null;
  74. FormsAuthentication.SignOut();
  75. }

关于form验证的处理片断的更多相关文章

  1. Nodejs之MEAN栈开发(四)---- form验证及图片上传

    这一节增加推荐图书的提交和删除功能,来学习node的form提交以及node的图片上传功能.开始之前需要源码同学可以先在git上fork:https://github.com/stoneniqiu/R ...

  2. Asp.Net Form验证不通过,重复登录

    问题产生根源: 当然,其实应该需要保持线上所有机器环境一致!可是,写了一个小程序.使用的是4.5,aysnc/await实在太好用了,真心不想把代码修改回去. so,动了念头,在这台服务器上装个4.5 ...

  3. tornado web高级开发项目之抽屉官网的页面登陆验证、form验证、点赞、评论、文章分页处理、发送邮箱验证码、登陆验证码、注册、发布文章、上传图片

    本博文将一步步带领你实现抽屉官网的各种功能:包括登陆.注册.发送邮箱验证码.登陆验证码.页面登陆验证.发布文章.上传图片.form验证.点赞.评论.文章分页处理以及基于tornado的后端和ajax的 ...

  4. form验证及图片上传

    form验证及图片上传 这一节增加推荐图书的提交和删除功能,来学习node的form提交以及node的图片上传功能.开始之前需要源码同学可以先在git上fork:https://github.com/ ...

  5. angular实现form验证

    先上效果页面:https://lpdong.github.io/myForm-1/ 其中几个知识点 1.angularJs提供了几个新的type类型: type="password" ...

  6. Python Django的分页,Form验证,中间件

    本节内容 Django的分页 Form 中间件 1 Django 分页 1.1 Django自带的分页 1.首先来看下我的测试数据环境 ############ models.py ######### ...

  7. Django中Form验证

    Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 一,Form验证 第一种操作:主要是这三个函数 ...

  8. Django form验证

    # 模版 class LoginForm(forms.Form): # 模版中的元素 user = forms.CharField(min_length=6,error_messages={" ...

  9. python自动化开发-[第二十一天]-form验证,中间件,缓存,信号,admin后台

    今日概要: 1.form表单进阶 2.中间件 3.缓存 4.信号 5.admin后台 上节课回顾 FBV,CBV 序列化 - Django内置 - json.dumps(xxx,cls=) Form验 ...

随机推荐

  1. CSS样式“display:none”与“visibility:hidden”区别

    CSS样式“display:none”和“visibility:hidden”都可以实现将页面元素隐藏,但是具体的效果是有差别的!下面通过两个小实验来说明这种差异. 实验代码: <!DOCTYP ...

  2. 字符串匹配--manacher算法模板

    manacher算法主要是处理字符串中关于回文串的问题的,它可以在 O(n) 的时间处理出以字符串中每一个字符为中心的回文串半径,由于将原字符串处理成两倍长度的新串,在每两个字符之间加入一个特定的特殊 ...

  3. 5天玩转C#并行和多线程编程

    5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq 5天玩转C#并行和多线程编 ...

  4. 39:第n小的质数

    39:第n小的质数    总时间限制:    1000ms    内存限制:    65536kB描述    输入一个正整数n,求第n小的质数.输入    一个不超过10000的正整数n.输出    ...

  5. 完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能

    #!/bin/usr/env python#coding=utf-8'''完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能'''try: a=int(raw_input(" ...

  6. ecstore与淘宝sdk的autoload加载顺序问题

    ecstore使用spl_autoload_register实现类的自动加载,这个很大的方便我们不用每次都要手动的去include一些类和函数.不过这样会导致一些问题,比如说,有一些extension ...

  7. android学习笔记55——ContentProvider_2

    实现ContentProvider 创建ContentProvider的步骤: 1.开发一个ContentProvider的子类,该子类需要实现增.删.改.查等方法: 2.在AndroidMainfe ...

  8. 物流公司统计按物资类别采购的前二十家sql

    2.集团主要的供应商(按物资分类列举前10或20家名单),年采购金额.占比,结算方式,付款周期:(夏) 年份要求是2013年 arap_djfb中的单据日期不是常规的日期类型 需要做这样的转换才可以 ...

  9. JVM参数(一)JVM类型以及编译器模式

    现在的JVM运行Java程序(和其它的兼容性语言)时在高效性和稳定性方面做的非常出色.自适应内存管理.垃圾收集.及时编译.动态类加载.锁优化——这里仅仅列举了某些场景下会发生的神奇的事情,但他们几乎不 ...

  10. GC之六--SystemGC完全解读

    概述 JVM的GC一般情况下是JVM本身根据一定的条件触发的,不过我们还是可以做一些人为的触发,比如通过jvmti做强制GC,通过System.gc触发,还可以通过jmap来触发等,针对每个场景其实我 ...