public virtual void SignIn(s_User user, bool createPersistentCookie)
{
var now = DateTime.UtcNow.ToLocalTime(); //01 实例化一个form表单身份验证票证
//FormsAuthenticationTicket(int version, string name, DateTime issueDate, DateTime expiration, bool isPersistent, string userData, string cookiePath);
var ticket = new FormsAuthenticationTicket(
/*version*/, //票证的版本号
user.Nickname, //用户名
now, //发生时间
now.Add(_expirationTimeSpan), //过期时间,通常用FormsAuthentication.Timeout作默认值
createPersistentCookie, //true存储在cookie,false存储在url,这个用户选择,“记住我”
user.Email, //用户数据,这里只保存了email
FormsAuthentication.FormsCookiePath); //Cookie存放路径,通常用FormsAuthentication.FormsCookiePath作默认值 //02 将票证加密成适合cookie保存的字符串
string encryptedTicket = FormsAuthentication.Encrypt(ticket); //03 将加密后的字符串写入cookie
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
cookie.HttpOnly = true; //不允许客户端脚本访问cookie,仅限http访问
if (ticket.IsPersistent)//如果票证需要持久化,指定cookie过期时间
{
cookie.Expires = ticket.Expiration;
}
//使用https传输此cookie
cookie.Secure = FormsAuthentication.RequireSSL;
cookie.Path = FormsAuthentication.FormsCookiePath;
if (FormsAuthentication.CookieDomain != null)
{
cookie.Domain = FormsAuthentication.CookieDomain;
} _httpContext.Response.Cookies.Add(cookie);
_cachedUser = user; //如果想用默认的方式处理,不写上面那么多:FormsAuthentication.SetAuthCookie(loginName, true);
} //验证当前通过验证的用户
public virtual s_User GetAuthenticatedUser()
{
//如果有缓存的用户,就返回缓存的用户 //如果是基于http会话级的生命周期注入方式,则是可以这样写的
if (_cachedUser != null) return _cachedUser; if (_httpContext == null || //如果httpContext为空
_httpContext.Request == null || // 或httpContext.Request为空 Request.IsAuthenticated为假就返回 空
!_httpContext.Request.IsAuthenticated || // 或或httpContext.Request.IsAuthenticated = false
!(_httpContext.User.Identity is FormsIdentity)) //_httpContext.User.Identity的票证不是 FormsIdentity
{
return null; // 都返回null, 即用户验证失败
} //获取会话中的表单身份验证票证[这个user封装了读cookie,解密cookie,验证转换的过程]
var formsIdentity = (FormsIdentity)_httpContext.User.Identity; //从formsIdentity.Ticket.UserData取email
var userEmail = formsIdentity.Ticket.UserData; //如果email验证失败,则验证失败
if (String.IsNullOrWhiteSpace(userEmail)) return null; //用email去查询数据库,获取user
var user = _userService.GetUserByEmail(userEmail); //如果是合法用户,返回当前合法用户
if (user != null && user.Active ) _cachedUser = user;
return user;
} public virtual void SignOut()
{
_cachedUser = null;
FormsAuthentication.SignOut();
}

关于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. CF 600B Queries about less or equal elements --- 二分查找

    CF 600B 题目大意:给定n,m,数组a(n个数),数组b(m个数),对每一个数组b中的元素,求数组a中小于等于数组该元素的个数. 解题思路:对数组a进行排序,然后对每一个元素b[i],在数组a中 ...

  2. vi编辑器使用相关

    一.vi的使用 1.vi一共分为3种模式,分别是一般模式.编辑模式和命令行模式 2.一般模式:以vi打开一个文件就直接进入一般模式(也是默认的模式). 在这个模式下可以使用上下左右移动光标,还可以删除 ...

  3. JSP知识点汇总

    有几种方法可以实现服务器内部跳转? 使用request对象提供的方法:request.getRequestDispatcher(String URI).forward(ServletRequest r ...

  4. Appium使用PageFactory初始化对象时报空指针错误

    自己的测试框架里面,每个app页面都要初始化appium field,所以想到使用一个静态的变量,后来初始化一个页面对象时总是报空指针. 在网上找了好多材料,看着没有什么区别.后来在github上面看 ...

  5. Java项目下jar包的放置

    build path:引用 web-inf/lib:固定 eclipse编译项目是根据build path的.如果不用eclipse来发布项目的话,就会找不到jar. tomcat运行时首先在它自己的 ...

  6. LeetCode "Integer Break"

    A typical CS style DP based solution: class Solution(object): def __init__(self): self.hm = {} def i ...

  7. 如何测试手机上的SOAP客户端

    周四晚上,服务端和客户端的两个同事因为soap接口的问题争论了起来.服务端的同事认为客户端的同事发给服务端的soap消息的xml结构有问题,少了几个xml节点,导致服务器端解析出错.而客户端的同事认为 ...

  8. DataTable排序(转)

    DataTable 排序   DataRow[] rows = dataTable1.Select("", "ord asc");   DataTable t ...

  9. “请运行Chkdsk工具”怎么解决

    今天重新系统,想从移动硬盘中拷贝数据,但是老是提示:“请运行Chkdsk工具” 于是在百度搜索一下,有人提供的解决方案很不错,在些引用一下,以备忘! 电脑上经常遇到这样的提示“某某某文件已损坏且无法读 ...

  10. JAVA设计模式之合成模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述合成(Composite)模式的: 合成模式属于对象的结构模式,有时又叫做“部分——整体”模式.合成模式将对象组织到树结构中,可以用来描述 ...