票据身份验证并存入Cookie-程序员宅基地

技术标签: C#  


前言


一、票据身份验证是什么?

C#票据身份验证一般用于登录验证存取用户信息以及判断用户是否登录

二、使用步骤

1.存入Cookie(信息存入Cookie之后基本就可以通过Cookie是否存在去判断用户是否登录过)

代码如下(示例):

一般票据存取是在登录之后进行的操作,所以都是判断用户登录成功之后的操作。

首先配置web.config

<authentication mode="Forms">
      <forms name="loginName" loginUrl="/Home/Login" cookieless="UseCookies" path="/" protection="All" timeout="30"/>
    </authentication>

创建登录视图模型viewmodel,以及dto视图模型(模型验证引用using System.ComponentModel.DataAnnotations;)

创建控制器的登录action
1、判断模型验证是否满足要求
2、通过页面获取的视图模型判断账号密码是否正确,是否能找该用户信息(如果找到进行3,否则添加错误信息,返回视图)
3、获取返回路径,如果获取到了跳到返回路径对应路径,否则跳到默认页面ReturnUrl
4、登录成功则获取用户信息并存入票据(using System.Web.Security;)
4.1、获取用户数据转成json
4.2、创建票据FormsAuthenticationTicket(对票据进行加密FormsAuthentication.Encrypt)(https://technet.microsoft.com/zh-cn/library/system.web.security.formsauthenticationticket.version)
4.3、票据加密FormsAuthentication.Encrypt
4.4、创建Cookie HttpCookie()
4.5、获取当前HTTP上下文 HttpContext;若为空则抛出异常(throw new ArgumentNullException(“context为空”);)
4.6、写入Cookie(https://www.cnblogs.com/tzyy/p/4151291.html)(先移除再添加)

            //4、登录成功则获取用户信息并存入票据(using System.Web.Security;)
            //4.1、获取用户数据转成json
            string userJson = adminDTO.ToJson();
            //4.2、创建票据FormsAuthenticationTicket(对票据进行加密FormsAuthentication.Encrypt)(https://technet.microsoft.com/zh-cn/library/system.web.security.formsauthenticationticket.version)        
            FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(2, "loginName", DateTime.Now, DateTime.Now.AddDays(1), false, userJson);
            //4.3、票据加密FormsAuthentication.Encrypt
            var encryptTicket = FormsAuthentication.Encrypt(ticket);
            //4.4、创建Cookie HttpCookie()
            HttpCookie httpCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptTicket);
            //4.5、获取当前HTTP上下文 HttpContext; 若为空则抛出异常(throw new ArgumentNullException("context为空");)
            httpCookie.Path = FormsAuthentication.FormsCookiePath;
            if (isRemeberMe)
            {
    
                httpCookie.Expires = DateTime.Now.AddDays(1);
            }
            //创建HttpContext上下文对象
            HttpContext httpContext = HttpContext.Current;

            //4.6、写入Cookie(先移除再添加)
            httpContext.Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
            httpContext.Response.Cookies.Add(httpCookie);

2.在Global文件中获取Cookie值,解析Cookie值,拿到Cookie信息在全局中进行操作

在Global中注册Application_AuthenticateRequest事件函数,用于解析客户端发过来的Cookie数据
//1.通过sender获取HttpApplication
//2.拿到HTTP上下文
//3.根据FormsAuthentication.FormsCookieName从上下文请求中获取到Cookie
//4.解密cookie.Value获得票据
//5.判断票据的UserData,如果不为空则反序列化为实体
//6.将上下文中的User数据实例化,通过MyFormsPrincipal的构造函数 ticket,userData

代码如下(示例):

 //通过sender获取HttpApplication
            HttpApplication app = sender as HttpApplication;
            //拿到一个HTTP上下文
            HttpContext httpContext = app.Context;
            //根据FormsAuthentication.FormsCookieName从下文中获取Cookie
            var cookie = httpContext.Request.Cookies[FormsAuthentication.FormsCookieName];
            if (cookie!=null)
            {
    
                if (!string.IsNullOrWhiteSpace(cookie.Value))
                {
    
                    var ticket = FormsAuthentication.Decrypt(cookie.Value);
                    if (!string.IsNullOrWhiteSpace(ticket.UserData))
                    {
    
                        LoginAdminDTO userData = ticket.UserData.ToObject<LoginAdminDTO>();
                        //将上下文中的User数据实例化,通过MyFormsPrincipal的构造函数 ticket,userData
                        Context.User = new MyFormsPrincipalDTO<LoginAdminDTO>(ticket, userData);
                    }
                }
            }
            页面实例化上下文User 获取Cookie内容(全局操作)
var user = User as MyFormsPrincipalDTO<LoginAdminDTO>;

该处使用的url网络请求的数据。


总结

提示:这里对文章进行总结:
例如:文章是针对于登录之后的操作而进行的用户身份认证以及身份信息存取,当用户登录之后将用户信息存取在Cookie中并进行加密(保护用户隐私),并在Global设置全局变量,以便于在项目其他版块中获取用户信息并进行操作,(登录加盐加密在上一章总结中有提到)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/LiAShuo/article/details/112461531

智能推荐

[已更新]Cisco Packet Tracer 注册、中文、软件下载问题_ciscopacket tracer注册码-程序员宅基地

文章浏览阅读1.5w次,点赞7次,收藏35次。#这个是一个废话吗?你觉得可以直接跳过。因为教学原因,我必须要去学会使用Cisco Packet Tracer基本功能。之前有一些布置路由器的经验,让我觉得布置路由器可以在这个软件很好的学习一下,来提高自己的能力和减少一些错误。但是很糟糕的是一开始我就遇到了语言不通等头痛事情,我需要花些时间去解决。下面是我通过一些实践获得经验,仅供参考。软件的下载软件我下载的是7.1版本,至于为什么下载汉化..._ciscopacket tracer注册码

CSS选择器_css选择器有_______a属性选择器b伪类选择器c通用兄弟元素选择器d否定选择器-程序员宅基地

文章浏览阅读5.2k次,点赞30次,收藏104次。根据W3C定义CSS3 选择器:在 CSS 中,选择器是一种模式,用于选择需要添加样式的元素。基础选择器层次选择器伪类选择器伪元素选择器属性选择器【基础选择器】元素选择器(选择元素名) \ 如:p{color:red;}ID选择器(#号+ID名)\ 如:#csdn{color:black;}类选择器(.+class名) \ 如..._css选择器有_______a属性选择器b伪类选择器c通用兄弟元素选择器d否定选择器

【Web前端面试】葵花宝典(2022版本)——Vue篇_vue面试题葵花宝典-程序员宅基地

文章浏览阅读4.8k次,点赞106次,收藏195次。你还在担心面试不过嘛?面试题找不到,小编特意整理了30+道高频前端面试题,送给大家,希望大家都能顺利通过面试,拿下高薪,也可持续关注本面试题专栏。本篇文章主要写的是面试题中的Vue篇,之后会更新前端其他方面相关面试题。........................_vue面试题葵花宝典

【转】CAN总线学习笔记(3)- CAN协议错误帧_如何模拟发送错误帧报文-程序员宅基地

文章浏览阅读748次。依照瑞萨公司的《CAN入门书》的组织思路来学习CAN通信的相关知识,并结合网上相关资料以及学习过程中的领悟整理成笔记。好记性不如烂笔头,加油!1 错误帧的帧结构在发送和接收报文时,总线上的节点如果检测出了错误,那么该节点就会发送错误帧,通知总线上的节点,自己出错了。错误帧由错误标志和错误界定符两个部分组成。主动错误标志:6个连续的显性位; 被动错误标志:6个连续的隐性位; 错误界定符:8个连续的隐性位。可以看到在错误标志之后还有0~6位的错误标志重叠,这一段最低有0个位,最多有6个位,关_如何模拟发送错误帧报文

android控件的绘制过程_android调用控件的()方法绘制控件的界面-程序员宅基地

文章浏览阅读795次。http://blog.csdn.net/qinjuning/article/details/7110211/_android调用控件的()方法绘制控件的界面

重启服务器之后的 502 Bad Gateway_网站502bad重启服务器可以吗-程序员宅基地

文章浏览阅读6.4k次。服务器重启之后,出现502 Bad Gateway_网站502bad重启服务器可以吗

随便推点

docker 映射端口穿透内置防火墙_docker 防火墙-程序员宅基地

文章浏览阅读2k次,点赞17次,收藏20次。docker 映射端口穿透内置防火墙_docker 防火墙

Java命令行_java(tm) se runtime environment (build 1.7.0_80-b1-程序员宅基地

文章浏览阅读465次。Ubuntu下。我在/home/sen/JavaProgram 下写了CommandLine.javapublic class CommandLine { public static void main(String args[]){ for(int i=0; i

Unity3D游戏开发中100+效果的实现和源码大全 - 收藏起来肯定用得着_unity 特效100-程序员宅基地

文章浏览阅读6.6k次,点赞27次,收藏323次。绝对干货,请收藏以让自己觉得已掌握需要时随时查阅,请点击在看及转发到朋友圈以在朋友圈装逼帮助更多的朋友!感谢各位一直以来的关注与支持!我们的公众号Unity3D游戏开发精华教程干货(u3dnotes)从发布第一篇技术干货文章到今天已经差不多3年了,期间不间断更新了技术干货文章560余篇,范畴涵盖使用Unity3D进行游戏、VR/AR/MR等XR开发及应用开发各方面,范围包括:Unity3D各种效果的Shader等实现、Shader等Unity3D图形渲染知识、骨骼动画和物理等Uni..._unity 特效100

Redis cluster集群:原理及搭建_--enable-redis-cluster-程序员宅基地

文章浏览阅读181次。1.为什么使用redis?redis是一种典型的no-sql 即非关系数据库 像python的字典一样 存储key-value键值对 工作在memory中所以很适合用来充当整个互联网架构中各级之间的cache 比如lvs的4层转发层 nginx的7层代理层尤其是lnmp架构应用层如php-fpm或者是Tomcat到mysql之间 做一个cache 以减轻db的压力因为有相当一部分的..._--enable-redis-cluster

【STM32】keil5兼容打开keil4工程_keil5打开keil4工程-程序员宅基地

文章浏览阅读1.2k次。keil5兼容打开keil4工程。可以通过安装兼容包解决。_keil5打开keil4工程

ADSL上网TP-LINK路由器设置方法_tplik modem.net-程序员宅基地

文章浏览阅读1.2k次。最后由 Lulu 于 2011-04-14 17:31:22 修改TP-LINK路由器 PPPOE拨号方式路由器操作指南首先把路由器的WAN口和Modem的LAN口连接起来,电脑网卡连接路由器任意一个LAN口;如果是网线到家,就直接把网线接到路由器WAN口。 然后为电脑设置网络参数,指定IP地址,如果电脑不多的话,建议用户手动指定IP地址。若路由器为默认设置,那么主_tplik modem.net

推荐文章

热门文章

相关标签