【ASP.NET MVC】使用动软(四)(12)
一、筛选器类和Cookie实现路由
需解决的问题:
网站登录往往需要用户名+密码验证,为避免重复验证,一般采用Cookie 、Session等技术来保持用户的登录状态:
Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;
Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式
从上解释可见,Cookie 比 Session 更简单,也不占用服务器的资源。
ActionFilterAttribute + Cookie 可以解决 以上问题:
首先,在工程中新建一个空目录(名称自取):

然后,在目录中添加一个类 UserCookie 负责对用户登录信息的Cookie相应操作:
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
namespace ManageSysetm.Tools
{public class UserCookie{public static T JsonDeserialize<T>(string jsonString){return JsonConvert.DeserializeObject<T>(jsonString);}public static string ToJson(object obj){JsonSerializerSettings settings = new JsonSerializerSettings();settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;return JsonConvert.SerializeObject(obj);}public static void WriteCookie(Maticsoft.Model.user mod){ FormsAuthentication.SetAuthCookie(ToJson(mod), true, FormsAuthentication.FormsCookiePath);//把用户对象保存在票据里 FormsAuthenticationTicket Ticket = new FormsAuthenticationTicket(1, mod.userName, DateTime.Now, DateTime.Now.AddTicks(FormsAuthentication.Timeout.Ticks), false, ToJson(mod));//加密票据string hashTicket = FormsAuthentication.Encrypt(Ticket);HttpCookie userCookie = new HttpCookie(FormsAuthentication.FormsCookieName, hashTicket);userCookie.Expires.AddHours(3);System.Web.HttpContext.Current.Response.Cookies.Add(userCookie);}public static Maticsoft.Model.user ReadCookie(){try{var cookie = System.Web.HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName]; //的到Cookieif (cookie == null)return null;var ticket = FormsAuthentication.Decrypt(cookie.Value); //解密票据string str = ticket.UserData;return JsonDeserialize<Maticsoft.Model.user>(str);}catch{return null;}}public static void ReMoveCookie(){FormsAuthentication.SignOut();}}
}
说明:
1、添加了序列化的Json处理函数,关于JSON可以参考前面的介绍;
2、读写Cookie:对输入的Model 序列化 (ToJson) 成字符串,然后写入票据,读的过程正好相反
再添加筛选器类:IsLogin 继承于 ActionFilterAttribute
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;namespace ManageSysetm.Tools
{public class IsLogin : ActionFilterAttribute{//当方法执行时 public override void OnActionExecuting(ActionExecutingContext filterContext){try{ var isLogin = UserCookie.ReadCookie();if (isLogin == null){filterContext.Result = new RedirectResult("/Home/login"); }}catch{filterContext.Result = new RedirectResult("/Home/login"); }base.OnActionExecuting(filterContext);}//当方法执行完毕public override void OnActionExecuted(ActionExecutedContext filterContext){base.OnActionExecuted(filterContext);}}
}
逻辑比较简单:判断是否存在Cookie,不存在的时候或者异常时跳转到登录页面,否则正常通过。
二、使用
可以用“帽子”的方法来实现筛选:

在默认的路由 Index上添加 筛选器 IsLogin ,则在该Action执行前先进行筛选器判断:取Cookie,没有则返回登录页面,否则正常进入Index 。
拓展:
既然可以添加 筛选器 IsLogin ,那么是否也可以添加 筛选器 IsAdmin (名称自取) ? ——这样可以根据不同用户角色筛选进入不同的页面。
当然是可以的,解决思路无非就是加入用户Cookie中身份的判断逻辑!
三、补充
数据表中用明文记录用户的密码是不可取的,一旦数据表被曝光后,用户的角色就能够被人使用。比如:数据库管理人员可以利用数据表中的用户名和密码直接进行用户角色登录!
解决方法是加密:(贴几个实用函数,可以放入某个工具类中)
private static string Key{get { return @")O[NB]6,YF}+efcaj{+oESb9d8>Z'e9M"; }}private static string IV{get { return @"L+\~f4,Ir)b$=pkf"; }}public static string Encrypt(string pwd)//加密{byte[] bKey = Encoding.UTF8.GetBytes(Key);byte[] bIV = Encoding.UTF8.GetBytes(IV);byte[] byteArray = Encoding.UTF8.GetBytes(pwd);//将字符串转换为字节序列string encrypt = null;Rijndael aes = Rijndael.Create();using (MemoryStream mStream = new MemoryStream())//创建内存流对象{using (CryptoStream cStream = new CryptoStream(mStream, aes.CreateEncryptor(bKey, bIV), CryptoStreamMode.Write))//创建加密流对象{cStream.Write(byteArray, 0, byteArray.Length);//向加密流中写入字节序列cStream.FlushFinalBlock();//将数据压入基础流,用缓冲区的当前状态更新基础数据源或储存库,随后清除缓冲区。encrypt = Convert.ToBase64String(mStream.ToArray());//从内存流中获取字节序列,并返回加密后的字符串}}aes.Clear();return encrypt;}public static string AESDecrypt(string encryptStr){byte[] bKey = Encoding.UTF8.GetBytes(Key);byte[] bIV = Encoding.UTF8.GetBytes(IV);byte[] byteArray = Convert.FromBase64String(encryptStr);string decrypt = null;Rijndael aes = Rijndael.Create();using (MemoryStream mStream = new MemoryStream()){using (CryptoStream cStream = new CryptoStream(mStream, aes.CreateDecryptor(bKey, bIV), CryptoStreamMode.Write)){cStream.Write(byteArray, 0, byteArray.Length);cStream.FlushFinalBlock();decrypt = Encoding.UTF8.GetString(mStream.ToArray());}}aes.Clear();return decrypt;}
使用方法比较简单:string s= UserCookie.Encrypt(password); //对密码加密处理
加密字符串,由此解决用户表密码信息的保护:

PS:
验证的时候不需要解密,用户输入的密码加密 与 数据表中字段匹配一下即可。
相关文章:
【ASP.NET MVC】使用动软(四)(12)
一、筛选器类和Cookie实现路由 需解决的问题: 网站登录往往需要用户名密码验证,为避免重复验证,一般采用Cookie 、Session等技术来保持用户的登录状态: Session是在服务端保存的一个数据结构,用来跟踪用户的状态&…...
【web逆向】全报文加密及其登录流程的分析案例
aHR0cHM6Ly9oZWFsdGguZWxkZXIuY2NiLmNvbS9zaWduX2luLw 涉及加密库jsencrypt 定位加密点 先看加密的请求和响应: 全局搜索加密字段jsondata,这种非特定参数的一般一搜一个准,搜到就是断点。起初下的断点没停住,转而从调用栈单步…...
MyBatis枚举映射类讨论
前言 本篇需要对于MyBatis有一定的认识,而且只是针对于TypeHandler接口来讨论,暂不讨论其他方面的问题 TypeHandler概叙 TypeHandler是MyBatis设计的一个用于参数的接口,你们会不会很好奇MyBatis是如何把整形,时间,字符…...
微信开发之朋友圈自动点赞的技术实现
简要描述: 朋友圈点赞 请求URL: http://域名地址/snsPraise 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参数名必选类型说明wId…...
Linux命令200例:sed对文本进行修改、替换和删除等操作的强大工具(常用)
🏆作者简介,黑夜开发者,全栈领域新星创作者✌。CSDN专家博主,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 &…...
python 合并多个excel文件
使用 openpyxl 思路: 读取n个excel的文件,存储在一个二维数组中,注意需要转置。将二维数组的数据写入excel。 安装软件: pip install openpyxl源代码: import os import openpyxl # 将n个excel文件数据合并到一个…...
【Docker】性能测试监控平台搭建:InfluxDB+Grafana+Jmeter+cAdvisor
前言 在做性能测试时,如果有一个性能测试结果实时展示的页面,可以极大的提高我们对系统性能表现的掌握程度,进而提高我们的测试效率。但是我们每次打开Jmeter都会有几个硕大的字提示别用GUI模式进行负载测试,而且它自带的监视器效…...
wordpress日主题Ripro9.0最新二开修正源码下载+美化包和插件
日主题Ripro9.0最新二开升级修正源码美化包和插件,RiPro9.0的二开版本新模板,包含2个美化包和全屏水印以及防复制插件。 模板和美化包路径:\wp-content\themes 插件路径:\wp-content\plugins,有兴趣的自行去体验吧...
fib Model Code史海拾贝
文章目录 0. 背景1. 强度等级不一致(20230807)1.1 问题描述(20230807)1.2 问题探索 0. 背景 本文主要记录在学习了解ModelCode的过程中产生的问题。当然,主要是我个人认为有意思的地方。欢迎有共同兴趣的网友留言一起…...
6.7.tensorRT高级(1)-使用onnxruntime进行onnx模型推理过程
目录 前言1. python-ort2. C-ort总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程,之前有看过一遍,但是没有做笔记,很多东西也忘了。这次重新撸一遍,顺便记记笔记。 本次课程学习 tensorRT 高级-使用 onnxruntime 进行 on…...
360未来安全研究院笔试题
笔试时间:2020.04.16,15:00-17:30。 岗位:Linux 安全开发工程师(实习生) 题型: 能力测试——逻辑题(20个5分=100分) 专业测试——客观题(40个2分=80分) 专业测试——在线编程题(2个25分=50分) 逻辑题 一共40道题目,很多逻辑推断题,包含数字找规律和图片找…...
Linux SSH 远程连接主机,并执行命令
应用场景 当需要远程到另一台Linux上,并在另一台机器上执行 Shell 命令,则需要注意命令的书写格式 示例说明 远程到 192.158.157.47 机器上,并执行命令 cd /tmp && ./zabbixagent_install.sh && echo Success 1、错误方式…...
FAST协议详解1 不同数据类型的编码与解码
一、概述 FAST协议里不同的数据类型在编码时有非常大的区别,比如整数只需要将二进制数据转为十进制即可,而浮点数则需要先传小数点位数,再传一个整数,最后将二者结合起来才是最终结果。本篇使用openfast自设了一些数据并编码成FA…...
黑马大数据学习笔记5-案例
目录 需求分析背景介绍目标需求数据内容DBeaver连接到Hive建库建表加载数据 ETL数据清洗数据问题需求实现查看结果扩展 指标计算需求需求指标统计 可视化展示BIFineBI的介绍及安装FineBI配置数据源及数据准备 可视化展示 P73~77 https://www.bilibili.com/video/BV1WY4y197g7?…...
网络编程——TCP/IP协议族(IP协议、TCP协议和UDP协议……)
TCP/IP协议族 一、IP协议 1、IP协议简介 IP协议又称网际协议 特指为实现在一个相互连接的网络系统上从源地址到目的地传输数据包(互联网数据包)所提供必要功能的协议,是网络层中的协议。 2、特点 不可靠:它不能保证IP数据包能成功地到达它的目的地,仅…...
Oracle SQL存储过程能够返回表吗
使用Oracle游标返回表数据 在Oracle存储过程中,我们可以使用游标来返回表的数据。游标是一种类似于指针的数据类型,可以用来遍历和操作结果集。以下是一个示例的Oracle存储过程,通过游标返回表数据: CREATE OR REPLACE PROCEDUR…...
2 Vue使用v-bind来代替{{}}取值
注意!当两个具有共同id的标签都要从数据层拿值时,需要使用div标签,赋予他们共同的id,不然其中有一个会拿不到数据! v-bind用来绑定前标签的属性,然后对属性赋值。{{}}用来对前后标签中的文本赋值。使用方法…...
20230807在WIN10下使用python3将TXT文件转换为DOCX(在UTF8编码下转换为DOCX有多一行的瑕疵)
20230807在WIN10下使用python3将TXT文件转换为DOCX(在UTF8编码下转换为DOCX有多一行的瑕疵) 2023/8/7 12:58 https://translate.google.com/?slen&tlzh-CN&opdocs 缘起,由于google的文档翻译不支持SRT/TXT格式的字幕,因此…...
Flutter(八)事件处理与通知
1.原始指针事件处理 一次完整的事件分为三个阶段:手指按下、手指移动、和手指抬起,而更高级别的手势(如点击、双击、拖动等)都是基于这些原始事件的。 Listener 组件 Flutter中可以使用Listener来监听原始触摸事件 Listener({…...
Java,python,c#,js,c++搞量化交易的接口大全
股票基金api接口地址:https://stockapi.com.cn 不想自己写的:https://stockapi.com.cn 除了牛逼,只剩下牛逼,除了方便,只剩下方便,python不是唯一的量化编程语言 接口说明:日线macd指标 https:/…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
从物理机到云原生:全面解析计算虚拟化技术的演进与应用
前言:我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM(Java Virtual Machine)让"一次编写,到处运行"成为可能。这个软件层面的虚拟化让我着迷,但直到后来接触VMware和Doc…...
