利用.Net自带的票据完成BaseController的未登陆自动跳转到登陆页功能
一:定义票据中要记录的字段类
/// <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的未登陆自动跳转到登陆页功能的更多相关文章
- 三篇文章带你极速入门php(三)之php原生实现登陆注册
看下成果 ps:纯天然h5,绝不添加任何添加剂(css)以及化学成分(js)(<( ̄ ﹌  ̄)我就是喜欢纯天然,不接受任何反驳) 关于本文 用原生的php和html做了一个登陆注册,大概是可以窥 ...
- django自带登录认证与登录自动跳转
# 导入django自带模块 from django.contrib.auth import authenticate, login, logout # 使用authenticate进行认证,使用lo ...
- 利用jdk自带的运行监控工具JConsole观察分析Java程序的运行
利用jdk自带的运行监控工具JConsole观察分析Java程序的运行 原文链接 一.JConsole是什么 从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能 ...
- 如何利用OpenCV自带的级联分类器训练程序训练分类器
介绍 使用级联分类器工作包括两个阶段:训练和检测. 检测部分在OpenCVobjdetect 模块的文档中有介绍,在那个文档中给出了一些级联分类器的基本介绍.当前的指南描述了如何训练分类器:准备训练数 ...
- VHDL学习:利用Quartus自带库3步快速完成状态机
Quartus自带库里面有各种编程语言的模板,供开发者参考. 初学者利用VHDL实现状态机比较生疏的情况下,可以调出该模板,适当修改即可. 本文将描述如何利用Quartus自带库调出状态机模板,并适当 ...
- 利用win10自带的系统配置禁止开机启动项和程序
一.利用win10自带的系统配置禁止开机启动项和程序 首先打开"运行"对话框,可以通过开始菜单打开运行,也可以按下快捷键WIN+R打开"运行".如下图. ...
- Java中的大小写字母相互转换(不利用Java自带的方法)
Java中的大小写字母相互转换(不利用Java自带的方法) 1.设计源码 /** * * @title:UpperAndLower.java * @Package:com.you.utils * @D ...
- C# 利用VS自带的WSDL工具生成WebService服务类
C# 利用VS自带的WSDL工具生成WebService服务类 WebService有两种使用方式,一种是直接通过添加服务引用,另一种则是通过WSDL生成. 添加服务引用大家基本都用过,这里就不讲 ...
- 小小知识点(一)——利用电脑自带的BitLocker对磁盘加密
1.利用电脑自带的BitLocker可以对固定的或移动的磁盘加密 网上有很多的使用方法步骤,可参考百度经验:https://jingyan.baidu.com/article/636f38bb4fac ...
随机推荐
- json文件_ajax
html源码代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...
- 通过案例学习 Secret - 每天5分钟玩转 Docker 容器技术(110)
在下面的例子中,我们会部署一个 WordPress 应用,WordPress 是流行的开源博客系统. 我们将创建一个 MySQL service,将密码保存到 secret 中.我们还会创建一个 Wo ...
- 【博客目录】SqlServer篇
SqlServer系列篇 [SqlServer系列]SQLSERVER安装教程 [SqlServer系列]数据库三大范式 [SqlServer系列]表单查询 [SqlSer ...
- IntelliJ IDEA 设置Output (输出窗口)窗口字体大小
Settings-->Editor-->Colors&Fonts-->Console Font 如图: 字体调好了以后使用起来眼睛就轻松多了
- 如何通过Mock API提高APP开发效率?
APP开发过程中,如果可以在客户端的正常项目代码中,自然地(不影响最终apk)添加一种模拟服务器数据返回的功能,这样就可以很方便的在不依赖服务器的情况下展开客户端的开发. Mock API提供了这一问 ...
- Spark2.2.0分布式集群安装(StandAlone模式)
一.依赖文件安装 1.1 JDK 参见博文:http://www.cnblogs.com/liugh/p/6623530.html 1.2 Scala 参见博文:http://www.cnblogs. ...
- 5.python函数
一.递归函数 如果一个函数在内部调用自身,那么这个函数就叫做递归函数. 1. 必须有一个明确的结束条件: 2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少: 3.递归效率不高,递归层次过 ...
- NOIP2017day1游记
NOIP 2017总结 Day1 Day1T1 第一眼看到瞬间慌掉,woc这玩意啥! 然后懵逼了两分钟 好的 我相信他是NOIP第一题 那我就打个表吧 然后花五分钟打了个暴力 玩了几组数据 哇!好像有 ...
- display:none和visiblity:hidden区别
相同: 1.两者都能隐藏元素. 不同: 1.display:none 不占页面空间,visiblity:hidden 占据原先页面空间. 这里必须说明的是,元素不占页面空间后,取该元素或其内部元素的宽 ...
- 浅谈,html\css脱离标准文档流相关
(个人知识有限,难免有误,请见谅) 标准文档流,顾名思义,是要按照一定规矩排列的,默认的就是元素会从左至右,从上至下排列,块级会独占一行,行内元素会和小伙伴们共享一行. 本来在标准文档流下,各个元素相 ...