一:定义票据中要记录的字段类

/// <summary>
/// 用户存在于浏览器端的身份票据(非持久)
/// 非持久 FormsAuthenticationTicket 的isPersistent为false只存于浏览器
/// 持久 True 也存于(win7中的位置为C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Cookies,注意Appdata是个隐藏的文件夹)
/// </summary>
public class UserTicket
{
  /// <summary>
  /// 用户Id(主键)
  /// </summary>
  public int UserId { get; set; }

  /// <summary>
  /// 用户账号
  /// </summary>
  public string UserAccount { get; set; }

  /// <summary>
  /// 用户姓名
  /// </summary>
  public string UserName { get; set; }

  /// <summary>
  /// 角色Id列表
  /// </summary>
  public List<int> RoleIds { get; set; }
}

二:用户登录控制器

public class LoginController : Controller

{

[HttpPost]
[AllowAnonymous]
public ActionResult Index(LoginModel model)
{

  //....DTO

  //获取用户账号,UserId,用户姓名和权限存入userdata里。
  UserTicket userTicket = new UserTicket();
  userTicket.UserId = entity.UserId;
  userTicket.UserAccount = entity.UserAcount;
  userTicket.UserName = entity.UserName;
  List<int> roles = new List<int>() { 1, 2, 3 };
  userTicket.RoleIds = roles;
  string userdata = string.Empty;
  if (entity != null)
  {
    userdata = JsonHelper.ToJSON(userTicket);
  }
//保存身份票据
  SetAuthenticationToken(entity.UserAcount, userdata);

}

//存票据

public void SetAuthenticationToken(string name, string userdata, bool createPersistentCookie = false)
{
   FormsAuthentication.SetAuthCookie(name, true, FormsAuthentication.FormsCookiePath);
   FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, name.ToString(), DateTime.Now, DateTime.Now.AddDays(1), true, userdata);
   string encTicket = FormsAuthentication.Encrypt(authTicket);
   this.Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));
}

}

三:在BaseController中解析票据并实现跳转路由

public class BaseController : Controller
{

/// <summary>
/// 用于检测用户是否登录,未登录的话跳转登录页面
/// </summary>
/// <param name="filterContext"></param>
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
  base.OnActionExecuting(filterContext);
  //这里判断出没有登录然后进行跳转
  if (String.IsNullOrEmpty(LoginUserInfo().UserAccount)) //未登录
   {
     //未登陆返回登陆页
     filterContext.Result = new RedirectToRouteResult(new System.Web.Routing.RouteValueDictionary(new { controller = "Login", action = "Index" }));
   }
}

/// <summary>
/// 取得登录用户信息
/// </summary>
/// <returns></returns>
protected UserTicket LoginUserInfo()
{
  string name = System.Web.HttpContext.Current.User.Identity.Name;
  UserTicket userTicket = new UserTicket();
  if (!string.IsNullOrEmpty(name))
  {
    FormsIdentity id = (FormsIdentity)System.Web.HttpContext.Current.User.Identity;
    FormsAuthenticationTicket ticket = id.Ticket;
    userTicket = JsonHelper.ParseJSON<UserTicket>(id.Ticket.UserData); 
  }
  return userTicket;
}

}

最后一步就是在想要的验证登陆的控制器前继承BaseController就好了

利用.Net自带的票据完成BaseController的未登陆自动跳转到登陆页功能的更多相关文章

  1. 三篇文章带你极速入门php(三)之php原生实现登陆注册

    看下成果 ps:纯天然h5,绝不添加任何添加剂(css)以及化学成分(js)(<( ̄ ﹌  ̄)我就是喜欢纯天然,不接受任何反驳) 关于本文 用原生的php和html做了一个登陆注册,大概是可以窥 ...

  2. django自带登录认证与登录自动跳转

    # 导入django自带模块 from django.contrib.auth import authenticate, login, logout # 使用authenticate进行认证,使用lo ...

  3. 利用jdk自带的运行监控工具JConsole观察分析Java程序的运行

    利用jdk自带的运行监控工具JConsole观察分析Java程序的运行 原文链接 一.JConsole是什么 从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能 ...

  4. 如何利用OpenCV自带的级联分类器训练程序训练分类器

    介绍 使用级联分类器工作包括两个阶段:训练和检测. 检测部分在OpenCVobjdetect 模块的文档中有介绍,在那个文档中给出了一些级联分类器的基本介绍.当前的指南描述了如何训练分类器:准备训练数 ...

  5. VHDL学习:利用Quartus自带库3步快速完成状态机

    Quartus自带库里面有各种编程语言的模板,供开发者参考. 初学者利用VHDL实现状态机比较生疏的情况下,可以调出该模板,适当修改即可. 本文将描述如何利用Quartus自带库调出状态机模板,并适当 ...

  6. 利用win10自带的系统配置禁止开机启动项和程序

    一.利用win10自带的系统配置禁止开机启动项和程序     首先打开"运行"对话框,可以通过开始菜单打开运行,也可以按下快捷键WIN+R打开"运行".如下图. ...

  7. Java中的大小写字母相互转换(不利用Java自带的方法)

    Java中的大小写字母相互转换(不利用Java自带的方法) 1.设计源码 /** * * @title:UpperAndLower.java * @Package:com.you.utils * @D ...

  8. C# 利用VS自带的WSDL工具生成WebService服务类

    C# 利用VS自带的WSDL工具生成WebService服务类   WebService有两种使用方式,一种是直接通过添加服务引用,另一种则是通过WSDL生成. 添加服务引用大家基本都用过,这里就不讲 ...

  9. 小小知识点(一)——利用电脑自带的BitLocker对磁盘加密

    1.利用电脑自带的BitLocker可以对固定的或移动的磁盘加密 网上有很多的使用方法步骤,可参考百度经验:https://jingyan.baidu.com/article/636f38bb4fac ...

随机推荐

  1. 【Jquery系列】之DOM属性

    1   概述 本章将结合JQuery官方API,对Jquery属性进行分析与讲解.主要讲.addClass(),.attr(),,hasClass(),,html(),.prop(),.removeA ...

  2. 深入理解计算机系统_3e 第六章家庭作业 CS:APP3e chapter 6 homework

    6.22 假设磁道沿半径均匀分布,即总磁道数和(1-x)r成正比,设磁道数为(1-x)rk: 由题单个磁道的位数和周长成正比,即和半径xr成正比,设单个磁道的位数为xrz: 其中r.k.z均为常数. ...

  3. Python的下划线_

    1.单下划线(_) 通常情况下,单下划线(_)会在以下3种场景中使用: 1.1 在解释器中: 在这种情况下,"_"代表交互式解释器会话中上一条执行的语句的结果.这种用法首先被标准C ...

  4. 多线程编程学习笔记——async和await(三)

    接上文 多线程编程学习笔记——async和await(一) 接上文 多线程编程学习笔记——async和await(二) 五.   处理异步操作中的异常 本示例学习如何在异步函数中处理异常,学习如何对多 ...

  5. 合并查询结果集UNION(去重), UNION ALL(不去重),INTERSECT(交集),MINUS(差集,第一个结果集减去第二个结果集,第一个结果集中不在第二个结果集中的记录行),[NOT] EXIST

    MINUS配合[NOT] EXIST使用可以查询出包含符合某个条件的多记录的其他记录, 举例: 顾客A买了商品2.4.6 顾客B买了商品1.2.4 顾客C买了商品4.6 顾客D买了商品1.2.4.6 ...

  6. Struts2学习---简单的数据校验、访问Web元素

    1.简单的数据校验 在action里面我们已经给出了一个数据校验: public String execute() { if(user.getUsername().equals("usern ...

  7. iOS动态性 运行时runtime初探(强制获取并修改私有变量,强制增加及修改私有方法等)

    借助前辈的力量综合一下资料. OC是运行时语言,只有在程序运行时,才会去确定对象的类型,并调用类与对象相应的方法.利用runtime机制让我们可以在程序运行时动态修改类.对象中的所有属性.方法,就算是 ...

  8. js垃圾回收机制

    垃圾回收机制,简称GC(garbage collection),会定期(周期性)地回收那些不再使用的变量,然后释放其内存. 而内存占用的情况有很多: 1.变量 2.字面量对象声明:var obj = ...

  9. Linux(CentOS6.5)下修改Nginx初始化配置

    本文地址http://comexchan.cnblogs.com/,作者Comex Chan,尊重知识产权,转载请注明出处,谢谢! 首先备份相关文件: cp /comexHome/nginx/conf ...

  10. java推送数据到app--极光推送

    之前项目有用到需要把数据推送到app端 采用的是极光推送 特此把工具类和pom.xml需要的jar整理如下 pom.xml需要jar如下 <!-- 极光推送 --> <depende ...