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();
}

最新文章

  1. [css]全屏背景图片设置,django加载图片路径
  2. 浅谈HTML5单页面架构(三)—— 回归本真:自定义路由 + requirejs + zepto + underscore
  3. jsoup开发网页客户端3
  4. A way to connect to network through WIFI on Centos 7
  5. 根据不同的实体及其ID来获取数据库中的数据
  6. 【读书笔记《Android游戏编程之从零开始》】1.Android 平台简介与环境搭建
  7. Update startup files更新安装文件
  8. jquery ajax php 无刷新上传文件 带 遮罩 进度条 效果的哟
  9. android智能家居在线语音控制
  10. phpcms安装完成后总是跳转到install/install.php
  11. 关于NotePad++ v1.0的编译和源码分析
  12. 参数化SQL小认识
  13. jasmine note
  14. IOS开发之XCode学习014:警告对话框和等待提示器
  15. Linux下安装配置jdk
  16. 学习UI的总结
  17. 一文读懂 JAVA 异常处理
  18. 验证二叉搜索树的golang实现
  19. 关于Android studio 设置点击打不开的解决
  20. MGR

热门文章

  1. jdbc 配置
  2. php部分---创建连接数据库类
  3. java SpringUtil获取bean
  4. chrome 49 版本 跨越 --args --disable-web-security --user-data-dir
  5. RelativeLayout.LayoutParams.addRule()方法
  6. Squid代理服务器的安装与配置
  7. Cellmap 基站查询 For Pc
  8. Keepalived安装使用详解
  9. boost-asio-cpp-network-programming阅读笔记
  10. datatable list 之前相互转换