Forms身份验证 知识总结
FormsAuthentication.SetAuthCookie()方法,传递一个登录名即可
FormsAuthentication.SignOut()方法退出
Forms验证可以保护受限制的页面比如有些页面未登录不能访问或者有的人没有权限访问
这些东西在web.Config中都可以配置
比如 有一个名字为MyInfo.aspx的页面要求这个页面的访问者必须为已经登陆的用户
可以这样子配置
<location path="MyInfo.aspx">
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</location>
但是这样子写如果页面多的话会导致代码过于冗杂,所以可以在代码设计初期,把有相同权限的功能模块
放在一起,所以forms验证可以在Web.config中可以配置一个目录,将多个页面放在同一个目录里,
<location path="Admin">
<system.web>
<authorization>
<allow roles="Admin"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
需要注意的是 allow和deny的顺序不能写错了,UrlAuthorizationModule将按照这个顺序依次判断的
如果这个页面只能某一类人访问,则需要在最后一条规则设置 <deny users="*"/>
同样的我们可以在allow和deny中指定多个用户,使用user,deny属性时记得要用逗号分隔开用户的列表,
问号?表示的匿名用户(不需要),星号*表示的所有用户
froms的身份验证是通过cookie来维持的,而且他的cookie是加密的
AuthenticateRequest事件,也就是意味着每次对应用程序进行页面请求的时候都会触发这个事件,实际上是调用相应的身份验证
模块来处理身份验证的,对于Forms而言,即使从加密的cookie中提取用户的信息并存到Identity和IPicioal
AuthorizeRequest 事件是在AuthenticateRequest事件中通过了身份验证的时候才会触发的,AhtorizeRequest事件调用相应的授权模块来检查用户是否被授权访问他们的请求资源
在ASP.NET中内置的授权模块主要有两个:FileAuthorizationModule和UrlAuthorizationModule。他们也实现了IHttpModule接口。这些模块可以参照所试用的身份验证类型来决定到底采用哪个授权模块:
如果试用的是Windows身份验证,那么在授权检查的时候就会使用FileAuthorizationModule;
如果在web.config中提供了<authorization/>元素,那么就会采用UrlAuthorizationModule。如下面的:
<allow roles ="" users=""/>
<deny users=""/>
</authorization>
2.如果凭证正确,那么就会再服务器端就会创建一个"身份验证票据"。身份验证票据中含有了经过加密的用户信息。
3.这个票据再服务器端被写入cookie中,然后发送到客户端。
4.然后用户就被重定向到他们最初请求的URL中。
实现Forms身份验证之前,我们看看组成Forms验证的API以及相关的类:
FormsAuthenticationModule:对每个请求进行验证的HTTP模块(实际上就是解析cookie中的加密信息的然后构造一个GenericPrincipal的类实例填充Context.User,并且也创建一个FormsIdentity的实例,FormsAuthenticationModule是一个HTTP模块;)
FormsAuthentication:包含在Forms验证中我们常用的方法和属性(很重要的,FormsAuthenticate是一个类,它有很多的方法和属性)
FormsIdentity:Forms验证标识。
FormsAuthenticationTicket:身份验证的票据,对用户的信息进行加密后的产物,我们一般把它写如cookie中,之前我们谈过了的。
上面的类在System.Web.Security下。
还有另外的情况。不知道大家是否记得web.config 中的一个配置的节点:
<authentication mode="Forms">
<forms>
<credentials>
<user name="xiaoyang" password="xiaoyang"/>
<user name="panyan" password="panyan"/>
</credentials>
</forms>
</authentication>
这个方法就这么简单的一"跳",但是其实在内部做了很多的事情:
1.为用户创建一个身份验证的票据
2.对身份验证的票据进行加密
3.创建一个cookie,把加密的票据保存在cookie中
4.向HTTP响应添加cookie,并且发送给客户端。
5.跳转,并且把用户重定向到最初请求的页面
FormsCookieName:获取或者设设置cookie的名称
FormsCookiePath:获取或者设置cookie的url路径
其中FormsCookiePath属性有一点要注意:大多数的浏览器会在判断cookie是否要和请求一起发送时,用到cookie路径。(我们一般在配置文件配置path="/"),如果我们配置的path不是"/",那么这个cookie就不会和请求发送到服务器端.
FormsAuthenticate中和cookie操作相关的方法有:
Decrypt:提取身份验证cookie的加密信息,创建FormsAuthenticationTicket,也就是解密。
Encrypt:加密。从FormsAuthenticationTicket中获取信息,并且加密。以备我们之后把加密的信息写入cookie
GetAuthCookie:创建身份验证cookie,但是并不把它立即添加到HTTP响应中
SetAuthCookie:创建身份验证cookie,并且把它添加到Response.Cookie中。
RenewTicketIfOld:刷新身份验证cookie的生命周期
SignOut:使得当前的身份验证cookie过期。我们常用的注销功能。
而且在<authentication/>节点中,我们还可以进行更多的设置。如下:
<authentication mode="Forms ">
<forms name="MyCookie"
loginUrl="Login.aspx"
timeout="60"
path="/"
protection="All">
</forms>
</authentication>
name:定义身份验证cookie的名称。因为我们把身份验证的票据是存放在cookie中的,而且我们必须给身份验证cookie取具有唯一性的名称,防止和其他的应用程序中的cookie冲突。
loginUrl:从英文名字就可以知道是关于登录的。实际上就是标明把用户重定向到哪个页面取登录。
timeout:设置身份验证cookie持续的时间,以分钟为单位的。而且这个时间是一个相对的时间,就是说每次对用户进行验证时,cookie的期限就会被重新设置。如果在60分钟内用户再没有向服务器发起请求,那么cookie就过期,之后如果用户再次发起请求,那么就要重新输入用户名和密码等信息。
path:设置cookie的保存的路径,一般是设置为"/",我们不要轻易的改变。
我们之前也说过,我们的身份验证的票据是加密以后再存放如cookie中的,然后再把cookie发送到客户端。当客户端再次请求的时候,再服务器端就会解析客户端发送来的cookie信息,我们必须要确认:客户端发送来的cookie信息就是我们之前从服务器端发送过去的,也就是说,我们要判断,我们的cookie在客户端是否被篡改了。
所以,这就是<forms/>中属性protection的用途。protection的值有四个:
Encryption:对cookie的内容信息进行加密。
Validation:向cookie中的内容添加MAC(消息验证代码),以便服务器判断cookie是否被篡改了。
None:禁用加密和篡改检查
All:同时启用加密和篡改检查。
默认情况下是"All",因为它可以把数据加密放入cookie中,而且对返回到服务器端的cookie进行验证。
Forms身份验证 知识总结的更多相关文章
- ASP.NET Forms 身份验证
ASP.NET Forms 身份验证 在开发过程中,我们需要做的事情包括: 1. 在 web.config 中设置 Forms 身份验证相关参数.2. 创建登录页. 登录页中的操作包括: 1. 验证用 ...
- asp.net Forms身份验证
Web.config中的配置<system.web><authentication mode="Forms"> <forms name="K ...
- 采用Asp.Net的Forms身份验证时,持久Cookie的过期时间会自动扩展
原文:http://www.cnblogs.com/sanshi/archive/2012/06/22/2558476.html 若是持久Cookie,Cookie的有效期Expiration属性有当 ...
- 采用Asp.Net的Forms身份验证时,非持久Cookie的过期时间会自动扩展
问题描述 之前没有使用Forms身份验证时,如果在登陆过程中把HttpOnly的Cookie过期时间设为半个小时,总会收到很多用户的抱怨,说登陆一会就过期了. 所以总是会把Cookie过期时间设的长一 ...
- Web分布式部署,跨应用程序Forms身份验证的集成方案
最近一个项目要求进行分布式部署.保证在双十一期间系统的正常运行,虽然该系统平时访问量不是很大,但是基于业务需要,必须在至少两台服务器上部署. 该系统需要登录后才可以使用,首先需要解决分布式部署的用户状 ...
- Forms身份验证和基于Role的权限验证
Forms身份验证和基于Role的权限验证 从Membership到SimpleMembership再到ASP.NET Identity,ASP.NET每一次更换身份验证的组件,都让我更失望.Memb ...
- .net Forms身份验证不能用在应用的分布式部署中吗?
参照网上的一些方法,使用Forms身份验证对应用进行分布式部署,发现没有成功. 应用部署的两台内网服务器:192.168.1.19,192.168.1.87,使用Nginx做负载分配,配置完全相同:每 ...
- ASP.NET:Forms身份验证和基于Role的权限验证
从Membership到SimpleMembership再到ASP.NET Identity,ASP.NET每一次更换身份验证的组件,都让我更失望.Membership的唯一作用就是你可以参考它的实现 ...
- asp.net的forms身份验证 单用户身份验证
asp.net的forms身份验证 单用户身份验证 首先要配置Web.config文件 <system.web> <authentication mode="Forms& ...
随机推荐
- IM & RTC
IM & RTC 即时通信(IM) & 实时通信(RTC) 场景 即时通信(可靠性高,延时高) 场景包括文字聊天.语音消息发送.文件传输.音视频播放等; 发短信 实时通信(可靠性低,延 ...
- search cascade select & AntD
search cascade select & AntD Antd https://ant.design/components/cascader-cn/#components-cascader ...
- 稳定币USDN的算法调控
在NGK公链的稳定币系统中,USDN的价格有时会出现一定幅度的波动.正如我们会看到USDT有时会是0.99美元,有时是1.01美元一样.那么,要保障USDN在二级市场的价格基本稳定,要如何调节供需呢? ...
- Spark集成
一.Spark 架构与优化器 1.Spark架构 (重点) 2.Spark优化器 二.Spark+SQL的API (重点) 1.DataSet简介 2.DataFrame简介 3.RDD与DF/DS的 ...
- 将日志发送到log日志文件中
log.debug("toUser:"+toUser+",subject:"+subject+",content:"+content);
- Same Origin Policy 浏览器同源策略详解
同源策略 Same Origin Policy 日常开发中最常与网络打交道,那关于浏览器的同源策略和跨域相关的知识是该整理一下了. 首先需要明确的是,同源策略是浏览器的安全策略,由于存在这个策略,我们 ...
- 错误信息:...\output\project.axf: error: l6218e: undefined symbol usart1_confing (referred from main.o).
说明:此文档知识用来记录,顺便给大家作为参考,如有错误的地方请大家多多指正,在下内心定会感激不尽. 前言:关于这个问题,我曾花了一个下午在网上寻找,网上的说法五花八门,我办法试尽,但遍寻无果.由此我认 ...
- Innodb的存储及缓存
参考[mysql技术内幕] 一.mysql体系结构和存储引擎 1.数据库与数据库实例 数据库:物理操作系统文件或者其他文件组成的集合: 数据库实例:有数据库后台进程/线程和一个共享内存区域组成. 数据 ...
- Redis缓存穿透、缓存雪崩、缓存击穿好好说说
前言 Redis是目前非常流行的缓存数据库啦,其中一个主要作用就是为了避免大量请求直接打到数据库,以此来缓解数据库服务器压力:用上缓存难道就高枕无忧了吗?no,no,no,没有这么完美的技术, 缓存穿 ...
- 【HTB系列】靶机Querier的渗透测试
出品|MS08067实验室(www.ms08067.com) 本文作者:大方子(Ms08067实验室核心成员) 总结与反思: 1.收集信息要全面 2.用snmp-check检查snmp目标是否开启服务 ...