使用Forms验证存储用户自定义信息
Forms验证在内部的机制为把用户数据加密后保存在一个基于cookie的票据FormsAuthenticationTicket中,因为是经过特殊加密的,所以应该来说是比较安全的。而.net除了用这个票据存放自己的信息外,还留了一个地给用户自由支配,这就是现在要说的UserData。
UserData可以用来存储string类型的信息,并且也享受Forms验证提供的加密保护,当我们需要这些信息时,也可以通过简单的get方法得到,兼顾了安全性和易用性,用来保存一些必须的敏感信息还是很有用的。
下面来看怎么使用UserData,然后会给出一个实际使用的例子。
//创建一个新的票据,将客户ip记入ticket的userdata
FormsAuthenticationTicket ticket=new FormsAuthenticationTicket(
1,userName.Text,DateTime.Now,DateTime.Now.AddMinutes(30),
false,Request.UserHostAddress);
//将票据加密
string authTicket=FormsAuthentication.Encrypt(ticket);
//将加密后的票据保存为cookie
HttpCookie coo=new HttpCookie(FormsAuthentication.FormsCookieName,authTicket);
//使用加入了userdata的新cookie
Response.Cookies.Add(coo);
下面是FormsAuthenticationTicket构造函数的重载之一的方法签名
public FormsAuthenticationTicket(
int version,
string name,
DateTime issueDate,
DateTime expiration,
bool isPersistent,
string userData
);
参数
version
版本号。
name
与身份验证票关联的用户名。
issueDate
Cookie 的发出时间。
expiration
Cookie 的到期日期。
isPersistent
如果 Cookie 是持久的,为 true;否则为 false。
userData
将存储在 Cookie 中的用户定义数据
使用userdata也很简单,FormsIdentity的Ticket属性就提供了对当前票据的访问,获得票据后就可以用UserData属性访问保存的信息,当然是经过解密的。
((System.Web.Security.FormsIdentity)this.Context.User.Identity).Ticket.UserData
下面是一个具体的应用。
由于Forms验证是通过cookie来进行的,它需要传递一个票据来进行工作。虽然票据是加密的,里面的内容不可见,但这并不能阻止别人用一个假冒的身份使用票据(就像我们可以拿别人的钥匙去开别人的锁),比较常见的就是不同ip的用户在不安全通道截获了这个票据,然后使用它进行一些安全范围外的活动。
解决这个问题的办法之一就是使用SSL来传递信息。
但是如果不能使用SSL呢?我们可以判断ip和票据是否匹配,如果发出请求的ip是初次产生票据的ip,则没有问题,否则就销毁这个票据。
为此,我们需要在一开始处理登录时将用户的ip保存起来,这样就可以在以后的请求中随时验证后继请求的ip是否和初始ip相同。保存这个敏感ip的最佳场所当然是UserData啦,而验证的时机则是在AuthenticateRequest事件发生时,即Global.aspx.cs中定义的处理此事件的Application_AuthenticateRequest方法中。
上面的示例实际上已经是把用户ip保存到了UserData中,下面是验证的过程。
if(this.Request.IsAuthenticated)
{
if(((System.Web.Security.FormsIdentity)this.Context.User.Identity).Ticket.UserData !=this.Request.UserHostAddress)
{
System.Security.Principal.GenericIdentity gi=new System.Security.Principal.GenericIdentity("","");
string[] rolesi={};
System.Security.Principal.GenericPrincipal gpi=new System.Security.Principal.GenericPrincipal(gi,rolesi);
this.Context.User=gpi;
}
}
通过给GenericPrincipal空的GenericIdentity和roles使票据失效,这样将强迫用户重新登录。为了测试这个方法,可以先把条件改为相等,看效果如何 :)
这个方法也有不足之处,具体为:
1.使用同一代理的用户将拥有同一个ip,这样就不能防范此类假冒攻击了
2.如果用户使用动态ip,则可能造成正常用户被我们强行销毁票据。不过总的来说,这个办法还是比较可行的。
转载于:https://www.cnblogs.com/cheatlove/articles/413315.html
使用Forms验证存储用户自定义信息相关推荐
- 2004-11-3 + 扩展Forms验证
1.使用Forms验证存储用户自定义信息 Forms验证在内部的机制为把用户数据加密后保存在一个基于cookie的票据FormsAuthenticationTicket中,因为是经过特殊加密的,所以应 ...
- Flask项目实战——7—(Redis数据库存储验证码信息、验证登录界面的表单信息、注册功能实现、登录实现)
推荐一个API平台:聚合数据 1.Redis数据库存储验证码信息 保存手机验证码到Redis数据库 公有视图文件:apps/common/views.py # -*- encoding: utf-8 ...
- Asp.Net的Forms验证,解决Cookie和Seesion失效时间。
网站开发中用户验证一般采用Asp.Net的Forms验证,验证票据存储到Cookie的方式. Session方式是将验证信息存储在内存中,如果你使用的虚拟主机给你分配很小的内存,实际上都是如此,那么s ...
- Asp.net中基于Forms验证的角色验证授权[转]
Asp.net的身份验证有有三种,分别是"Windows | Forms | Passport",其中又以Forms验证用的最多,也最灵活. Forms 验证方式对基于用户的验证授 ...
- 在Forms验证模式下,实现多个站点(SubDomain相同)共享同一用户登录状态
原文:http://caomao.cnblogs.com/archive/2005/07/05/186606.html 今天一早看了dudu关于二级域名Cookie的问题及解决方法,认为dudu的原理 ...
- 【转载】Asp.Net中基于Forms验证的角色验证授权
Asp.Net的身份验证有有三种,分别是"Windows | Forms | Passport",其中又以Forms验证用的最多,也最灵活. Forms 验证方式对基于用户的验证授 ...
- ASP.NET Forms验证 实现子域名(SubDomain)共享登陆下的缺陷 [转]
一.什么是单点登录 单点登录就是在多个web应用程序中,实现统一登录方式,一但登录了某web应用程序,其它相关联的web应用程 序都无需再次登录,一个地方退出,所有相关联的web应用程序都退出. 二. ...
- Asp.net中基于Forms验证的角色验证授权
Asp.net的身份验证有有三种,分别是"Windows | Forms | Passport",其中又以Forms验证用的最多,也最灵活. Forms 验证方式对基于用户的验证授 ...
- 使用ASP.NET 2.0 Profile存储用户信息
概要:许多ASP.NET应用程序需要跨访问的用户属性跟踪功能,在ASP.NET1.1中,我们只能人工实现这一功能.但如今,使用 ASP.NET 2.0的Profile对象,这个过程变得异常简单.Ste ...
最新文章
- 《AI系统周刊》第2期:硬件支持的Tensor-train分解与高效数据处理、清华吴文斐研究组获得NSDI最佳论文奖
- mac python3打包成窗体程序_python3代码打包成mac的程序,没办法运行,各位大神请指导一下...
- centos6.5系统自带python2.6升级到python2.7
- 输入框不可以输入中文
- flutter 轮播图动态加载网络图片
- php+mysql防注入字符串过滤_php 防sql注入过滤代码
- 辽宁交通高等专科学校计算机专业宿舍,辽宁省交通高等专科学校宿舍怎么样 住宿条件好不好...
- wordpress 表格文字对齐_掌握Word对齐技巧,排版又快又美观
- Java学习心得——整数太大的错误
- 计算机表格两行互换步骤,excel怎么让两行互换位置,EXCEL里两个格的内容怎么互换?...
- squid 折叠回源解析
- linux下socket编程常用头文件
- 程序员转行为什么这么难
- matlab最大回撤值,用matlab计算区间最大回撤值和最大回撤率
- Excel中如何实现批量中文转拼音
- 方法:判断一个点是否在一个立方体中
- mycat分片规则详解+实例演示
- 【TouchDesigner】三维渲染
- 监控服务器时间无法修改怎么办,监控服务器目录修改时间
- iOS 直播技术及Demo
热门文章
- countif函数比较两列不同_这些Excel函数公式,职场办公天天用,赶紧掌握!
- html计算天数,Javascript实现简易天数计算器
- linux cat 递归目录,黑猴子的家:Linux 文件目录命令
- android实践练习_android 练习之路 (四)
- php 下载后文件打不开,解决php下载excel无法打开的问题
- 安卓中java或取上下文_android-Xposed:如何获取挂钩的应用程序的上下文?
- 三星android11推送,三星国行S10系列正式推送One UI 3正式版,基于安卓11打造
- oracle 还原归档,ORACLE RMAN 还原归档日志
- n的整数倍补集的抓取python_python高阶(四)——集合学习
- 算法提高 理财计划(java)