说一说MVC的Authentication过滤(四)
前沿:
一般情况下,在我们做访问权限管理的时候,会把用户的正确登录后的基本信息保存在Session中,以后用户每次请求页面或接口数据的时候,拿到
Session中存储的用户基本信息,查看比较他有没有登录和能否访问当前页面。
Session的原理,也就是在服务器端生成一个SessionID对应了存储的用户数据,而SessionID存储在Cookie中,客户端以后每次请求都会带上这个
Cookie,服务器端根据Cookie中的SessionID找到存储在服务器端的对应当前用户的数据。
FormsAuthentication是微软提供给我们开发人员使用,做身份认证使用的。通过该认证,我们可以把用户Name 和部分用户数据存储在Cookie中,
通过基本的条件设置可以,很简单的实现基本的身份角色认证。
1.配置项
在网站根目录配置web.config
<authentication>
<forms name=".ASPXAUTH" loginUrl="account/index" defaultUrl="http://www.baidu.com" protection="All" timeout="" path="/" requireSSL="false" slidingExpiration="true" enableCrossAppRedirects="false" cookieless="UseDeviceProfile" domain="" ></forms>
</authentication>
2.控制器代码
public class accountController : Controller
{
// GET: account
public ActionResult Index()
{
return View();
}
[Authentication]
public ActionResult Demo() => View();
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index(string username,string userpwd)
{
List<LoginVm> userlist = new List<LoginVm>()//模拟数据
{
new LoginVm() { name="Zara", pwd="",State=},
new LoginVm(){name="aaaa",pwd="",State=}
}; if (!ModelState.IsValid)
{
return View();
}
bool status = Request.IsAuthenticated;
LoginVm vm = userlist.FirstOrDefault(u => u.name == username && u.pwd == userpwd);
JavaScriptSerializer serial = new JavaScriptSerializer();
//判断是否存在 且状态ok
if (vm!=null)
{
if (vm.State==)Content("您倍封号"); FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
, vm.name, DateTime.Now, DateTime.Now.AddMinutes(), false, serial.Serialize(vm));
string encrytedTicket = FormsAuthentication.Encrypt(authTicket);//创建票据
//响应客户端
HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName,encrytedTicket);
HttpContext.Response.Cookies.Add(authCookie);
}
return View();
}
}
3.过滤器方面
/// <summary>
/// 该过滤器为网站提供服务
/// 服务内容:行为添加标记即可进行过滤.不用在每个action中进行过滤!
/// </summary>
public class AuthenticationAttribute: ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{ if (!filterContext.RequestContext.HttpContext.Request.IsAuthenticated)
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.Result = new JsonResult
{
Data = new
{
Status = -,
Message = "登录过期,请重新登录!"
},
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
}
else
{
FormsAuthentication.RedirectToLoginPage();//重定向会登录页
}
}
else
{
var cookie = filterContext.HttpContext.Request.Cookies[FormsAuthentication.FormsCookieName];
//解密用户票据
var ticket = FormsAuthentication.Decrypt(cookie.Value);
//将密文映射到实体模型
LoginVm admin = new JavaScriptSerializer().Deserialize<LoginVm>(ticket.UserData);
//将数据放到ViewData里 方面页面使用
filterContext.Controller.ViewData["username"] = admin.name;
filterContext.Controller.ViewData["userpwd"] = admin.pwd;
}
//Don't forget this one
base.OnActionExecuting(filterContext);
}
}
我们可以在aciton行为中添加需要登录的视图,这样封装一起就不用一个一个在控制器搞了...
说一说MVC的Authentication过滤(四)的更多相关文章
- [译]MVC网站教程(四):MVC4网站中集成jqGrid表格插件(系列完结)
目录 1. 介绍 2. 软件环境 3. 在运行示例代码之前(源代码 + 示例登陆帐号) 4. jqGrid和AJAX 5. GridSettings 6. ...
- Asp.net mvc 知多少(四)
本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...
- ASP.NET MVC案例教程(四)
ASP.NET MVC案例教程(四) 前言 通过前几篇文章,我们已经能比较自如的使用ASP.NET MVC来呈现页面和数据了.但是,有一个大问题没有解决:如何处理表单数据.例如,我们将要实现的公告发布 ...
- ASP.NET MVC 5 Authentication Breakdown
In my previous post, "ASP.NET MVC 5 Authentication Breakdown", I broke down all the parts ...
- .NET MVC 学习笔记(四)— 基于Bootstarp自定义弹出框
.NET MVC 学习笔记(四)—— 基于Bootstarp自定义弹出框 转载自:https://www.cnblogs.com/nele/p/5327380.html (function ($) { ...
- 自己写一个java的mvc框架吧(四)
自己写一个mvc框架吧(四) 写一个请求的入口,以及初始化框架 上一章写了获取方法的入参,并根据入参的参数类型进行数据转换.这时候,我们已经具备了通过反射调用方法的一切必要条件.现在我们缺少一个htt ...
- Asp.Net MVC Filter权限过滤使用说明
相信对权限过滤大家都不陌生,用户要访问一个页面时,先对其权限进行判断并进行相应的处理动作. mvc中是如何实现权限验证的? mvc中是根据路由配置来请求控制器类中的一个方法 在mvc框架中为程序员提供 ...
- Spring MVC 学习总结(四)——视图与综合示例
一.表单标签库 1.1.简介 从Spring2.0起就提供了一组全面的自动数据绑定标签来处理表单元素.生成的标签兼容HTML 4.01与XHTML 1.0.表单标签库中包含了可以用在JSP页面中渲染H ...
- MVC中Action 过滤
总结Action过滤器实用功能,常用的分为以下两个方面: 1.Action过滤器主要功能就是针对客服端请求过来的对象行为进行过滤,类似于门卫或者保安的职能,通过Action过滤能够避免一些非必要的深层 ...
随机推荐
- Python2出现SyntaxError: Non-ASCII character '\xe5' in file *******
在使用Python2编写Python时,当使用中文输出或注释时运行脚本,会提示错误信息:SyntaxError: Non-ASCII character '\xe5' in file ******* ...
- C# 动态调用WebService 3
using Microsoft.CSharp; using System; using System.CodeDom; using System.CodeDom.Compiler; using Sys ...
- 关于阿里ICON矢量图(SVG)上传问题.
注意点: 1. 存储为svg格式(建议使用存储为svg,不要使用导出为svg)2. 图像位置:链接(注意哦,不要点嵌入和保留编辑功能)---确定3. AI里面选中图形,点对象-路径-轮廓化描边 软件编 ...
- Python面向对象编程指南
Python面向对象编程指南(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1SbD4gum4yGcUruH9icTPCQ 提取码:fzk5 复制这段内容后打开百度网 ...
- CF1097G Vladislav and a Great Legend
传送门 题目大意 一棵$n$个点的树,一个点集$S$的权值定义为把这个点击连成一个联通块的最少边数,求: $$ans=\sum_{S\in U}f(S)^k$$ 题解 这题跟gdoi那道题差不多 先把 ...
- css3_transition: 体验好的过渡效果。附 好看的按钮
利用css的transition属性详解,上图就是利用transition效果做的一个按钮. transition属性://举例子:transition:all 1s ease;transition: ...
- 马昕璐/唐月晨 《面向对象程序设计(java)》第十一周学习总结
一:理论部分. 一般将数据结构分为两大类:线性数据结构和非线性数据结构 线性数据结构:线性表.栈.队列.串.数组和文件 非线性数据结构:树和图. 线性表:1.所有数据元素在同一个线性表中必须是相同的数 ...
- Java语法细节 - 内存和枚举
目录 Java申请DirectBuffer ByteBuffer的position,limit,capacity,flip操作之间的关系 枚举实现单例模式 Java申请DirectBuffer /*- ...
- typeScript 学习
最近看了下typescript, 虽然说已经有很多人已经用到它了,但是我还是写写自己的feel咯:这里推荐学习链接 https://ts.xcatliu.com. 这个入门学习,我不好做评价,但是我自 ...
- Red and Black---POJ - 1979
There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A ...