使用Forms Authentication实现用户注册、登录 (三)用户实体替换

使用Forms Authentication实现用户注册、登录 (三)用户实体替换 收藏
IPrincipal和IIdentity
  通过查阅文档,我们可以看到HttpContext.User属性的类型是IPrincipal接口。然而我们知道,接口通常是不能直接访问的,其背后必定隐藏了一个实现了该接口的对象。那么这个实际对象的类型是什么呢?
  让我们在前面示例的MasterPage的Page_Init方法上加一个断点,再次运行程序,可以得到HttpContext.User属性的真正类型是System.Security.Principal.GenericPrincipal。
  查看IPrincipal接口的定义,可以看到它只有一个公开属性——Identity,其类型是这里要提到的另外一个重要接口IIdentity。通过上面的断点跟踪,我们还能知道对于GenericPrincipal而言,其Identity属性的实际类型是GenericIdentity,也是位于System.Security.Principal命名空间中。
  由此,我们引出了.NET Framework中关于Principal(实体)的整个类型系统。所有这些类型都位于mscorlib.dll程序集中,由此也可以看出,这套模型隶属于整个系统的基石。
 
实现自己的IPrincipal
  要想用自己的实体对象替换HttpContext.User,就必须让自己的实体对象实现IPrincipal接口;通常还必须伴随着实现IIdentity接口。
  目前系统中有的是一个数据实体对象。一般而言,实现IPrincipal接口有一下两种方式——
l 编写单独的类型实现IPrincipal接口,并在其中包含数据实体对象;
l 修改数据实体对象使其实现IPrincipal接口。
  对于这两种方式而言,其Identity属性可以通过以下三种方式实现——
l 使用.NET Framework提供的GenericIdentity;
l 创建自定义的类,实现Identity接口;
l 修改数据实体对象或自定义的实体类,让它们同时实现IPrincipal和IIdentity接口。
  对于简单的应用程序而言,通常可以修改数据实体对象,使其同时实现IPrincipal和IIdentity接口。而就复杂的分层架构应用程序,则建议在逻辑层创建分别实现了IPrincipal和IIdentity接口的对象。本文的示例      明显属于前一种情况,因此我们考虑修改作为数据实体类的UserObject类,让其实现两个接口。以下是修改完毕的UserObject类:
 
 1 public class UserObject : IPrincipal, IIdentity
 2 {
 3      ///<summary>
 4      ///用户名。
 5      ///</summary>
 6      public string Name;
 7  
 8      ///<summary>
 9      ///密码散列值。
10      ///</summary>
11      public string PasswordHash;
12  
13      ///<summary>
14      ///密码salt值。
15      ///</summary>
16      public string PasswordSalt;
17  
18      #region IIdentity Members
19  
20      public string AuthenticationType
21      {
22          get
23          {
24               return "Froms";
25          }
26      }
27  
28      public bool IsAuthenticated
29      {
30          get
31          {
32               return true;
33          }
34      }
35  
36      string IIdentity.Name
37      {
38          get
39          {
40               return this.Name;
41          }
42      }
43  
44      #endregion
45  
46      #region IPrincipal Members
47  
48      public IIdentity Identity
49      {
50          get
51          {
52               return this;
53          }
54      }
55  
56      public bool IsInRole(string role)
57      {
58          return false;
59      }
60  
61      #endregion
62 }

 
  首先我们来看一下对IIdentity接口的实现。该接口要求三个属性——AuthenticationType、IsAuthenticated和Name。AuthenticationType表示该用户标识所使用的验证类型,这里返回的是“Forms”;IsAuthenticated属性表示当前用户是否已经通过验证(即是否已登录。在这个例子里,我们只针对已登录用户进行实体替换,所以这个属性总是返回true。通常,实际的Web应用程序编写时还有一种习惯,就是为未登录用户(称之为匿名用户)也提供一个用户实体对象,此时就需要为IsAuthenticated提供逻辑,判断用户是否已通过验证了。最后IIdentity接口还要求对象提供一个Name属性,在这里,由于已经存在了Name字段,因此才用“显示接口实现”来提供Name属性,返回对象自身的Name字段即可。
  接下来我们看一下IPrincipal接口的实现。该接口要求提供一个Identity属性和一个IsInRole方法。由于UserObject类本身已经实现了IIdentity接口,因此在Identity属性中直接reutren this即可。因为我们这个示例不涉及用户分组(角色)方面的技术,因此IsInRole方法总是返回false。
 
用户实体替换
  用户实体替换即使用我们自己编写的类型的实例来替换HttpContext.User属性。实体替换应该发生在HttpApplication的PostAuthenticateRequest事件发生时,因为此时ASP.NET已经从客户端得到了用户凭证Cookie并进行了解密和校验。
  我们既可以编写一个HttpModule来处理PostAuthenticateRequest事件,也可以在Global..asax文件中添加时间处理器。这里为了简单,我们选择在Global.asax中添加如下事件处理器:
 
 1 void Application_PostAuthenticateRequest(object sender, EventArgs e)
 2 {
 3      HttpApplication app = (HttpApplication)sender;
 4      if(app.Context.User.Identity.Name != ""// 仅在已登录时替换
 5      {
 6          UserObject user = DataAccess.GetUserByName(app.Context.User.Identity.Name);
 7          app.Context.User = user;
 8          Thread.CurrentPrincipal = user;
 9      }
10 }
11 
 
  在这里我们首先进行了判断,如果用户已登录,才进行实体替换。当然你也可以选择未未登录用户也提供一个匿名用户实体。
  接下来,我们通过本来已经存放在HttpContext.User.Identity中的用户标识得到了数据实体对象,然后分别将其赋予HttpContext.User和Thread.CurrentPrincipal。
  至此,我们的示例代码就完工了。没有提到的是,完成了这一步之后,你就可以通过类似下面的代码在任何可以访问到HttpContext的地方获取用户实体了:
 
 1 UserObject user = HttpContext.Current.User as UserObject;
 2 if(user != null)
 3 {
 4        // 可以使用user
 5 }
 6 else
 7 {
 8        // 用户未登录
 9 }
10 
 
  需要注意,由于在这里我们仅对已登录用户进行了用户实体替换,所以代码使用as进行类型转换并结合if语句进行判断是必需的。
 
小结
  好吧,这一部分说的是用户实体替换。
 
2007年过去了,我很怀念。

转载于:https://www.cnblogs.com/qiantuwuliang/archive/2009/03/06/1404801.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304910.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微软亚洲研究院全球院友线上欢聚,共话新春

金鼠辞旧岁&#xff0c;金牛报春时&#xff1b;万象正更新&#xff0c;乾坤喜气多。西雅图时间 2 月 6 日&#xff0c;北京时间 2 月 7 日&#xff0c;由微软亚洲研究院院友会西雅图分会主办的“牛转新运”院友新春线上茶话会圆满落幕。重量级嘉宾沈向洋、洪小文、张亚勤、张宏…

从串行线程封闭到对象池、线程池

今天讲一个牛逼而实用的概念&#xff0c;串行线程封闭。对象池是串行线程封闭的典型应用场景&#xff1b;线程池糅合了对象池技术&#xff0c;但核心实现不依赖于对象池&#xff0c;很容易产生误会。 本文从串行线程封闭和对象池入手&#xff0c;最后通过源码分析线程池的核心原…

华硕xhci灰色_xHCI模式作怪无法使用USB设备?解决办法这里有!

最近许多云骑士问题群里朋友向我们反映&#xff0c;自己的USB设备包括USB键盘、鼠标、外置网卡......在重装系统后不能使用了或是启动变慢了许多&#xff0c;那么安装完系统后无法使用USB设备怎么办?经过排查&#xff0c;我们发现这是因为intel xHCI模式设置的问题&#xff0c…

netty springmvc_springmvc源码架构解析之HandlerMapping

说在前面前期回顾sharding-jdbc源码解析 更新完毕spring源码解析 更新完毕spring-mvc源码解析 更新完毕spring-tx源码解析 更新完毕spring-boot源码解析 更新完毕rocketmq源码解析 更新完毕dubbbo源码解析 更新完毕netty源码解析 更新完毕spring源码架构更新完毕springmvc源码架…

单片微型计算机系统应用和开发特点,单片微机原理与应用(第2版)

单片微机原理与应用(第2版)语音编辑锁定讨论上传视频《单片微机原理与应用(第2版)》是2019年7月机械工业出版社出版的图书&#xff0c;作者是罗印升。书 名单片微机原理与应用(第2版)作 者罗印升ISBN9787111538851定 价42.0元出版社机械工业出版社出版时间2019年7月装…

腾讯牛逼,我酸了!!

阅读本文大概需要8分钟。腾讯这两天搞了个业内爆炸沸腾的事情&#xff1a;全员阳光普照发放100股&#xff0c;解禁期一年。腾讯股价近年来一直在疯狂上涨&#xff0c;100股折合人民币6万多&#xff1a;关键是员工什么都没做&#xff0c;直接拿到价值6万的股票。作用可以说是相当…

如何创建生成非 MFC 项目的自定义 AppWizards

当自定义的应用程序向导生成一个项目时&#xff0c;则它只是不能替换自动创建的.dsp 项目设置文件。 .dsp 文件中的项目设置由假定所有生成的项目为 MFC 项目的内部规则设置。 但是&#xff0c;Visual C 5.0 的新对象模型允许修改工具设置&#xff0c;以便从生成的项目中删除所…

这本造价500万的“黑科技”日历,用377张爆美插画给你365天理想生活

以前&#xff0c;每个人家里&#xff0c; 都挂着一本日历。 爷爷戴着老花镜&#xff0c; 盘看着黄道吉日&#xff1b; 奶奶一字一句&#xff0c; 念叨着每日禁忌&#xff1b; 我们跟着日历过日子&#xff0c; 时光缓慢&#xff0c;记忆清晰。 那时候&#xff0c;日历本上的日子…

后端返回number类型数据_Javascript基础教程之数据类型 (数值 Number)

javascript中想限定一个数的数值&#xff0c;无需限定它是整数还是浮点数型var num1 80 ;var num2 55.51;var num3 -34;var num4 9e5;document.write(num1 " " num2 " " num3 " " num4);//运行结果 80 55.51 -34 900000toExponential(…

在计算机科学中计算是指,在计算机中数值计算是指什么

数值计算指有效使用数字计算机求数学问题近似解的方法与过程&#xff0c;以及由相关理论构成的学科。数值计算主要研究如何利用计算机更好的解决各种数学问题&#xff0c;包括连续系统离散化和离散形方程的求解&#xff0c;并考虑误差、收敛性和稳定性等问题。从数学类型分&…

eladmin代码自动生成_如何让Mybatis自动生成代码

点击上方“Java知音”&#xff0c;选择“置顶公众号”技术文章第一时间送达&#xff01;作者&#xff1a;阿进的写字台cnblogs.com/homejim/p/9782403.html在使用 mybatis 过程中&#xff0c; 当手写 JavaBean 和 XML 写的越来越多的时候&#xff0c; 就越来越容易出错。这种重…

.NET微服务

前文传送门&#xff1a;什么是云原生&#xff1f;现代云原生设计理念Microservices微服务是一种构建现代应用程序的流行的体系结构&#xff0c;云原生系统拥抱微服务。微服务是由一组(使用共享结构交互的、独立的小块服务)搭建的分布式集&#xff0c;具有以下特征&#xff1a;在…

还是找程序员做老公,最靠谱!

很多MM在选老公的时候&#xff0c;都会选择帅气多金&#xff0c;职业又稳定的男生做老公&#xff0c;像医生啊、律师啊、老师啊这类职业。 但是&#xff0c;你有没有想过&#xff1f; 医生的身边都围着好多护士小姐&#xff0c;而且天天加班是常态&#xff0c;相处的时间太少&a…

京瓷1020怎么打印自检页_[建筑]喷墨打印机如何打印自检页 详细

展开全部喷墨打印机如何打印自检页 介绍 打印自我测试、也称为内部测试&#xff0c;可用来32313133353236313431303231363533e59b9ee7ad9431333332636332验证打印机功能。打印自我测试时打印机无需连接到计算机。为每台打印机列出打印自我测试的说明。 可提式的惠普 Deskjet 1.…

计算机基础知识 pdf答案,计算机基础知识练习 答案版.pdf

计算机基础知识练习(B)1.计算机发展阶段的划分是以( )作为标志的。A)存储器 B)逻辑元件 C)程序设计语言 D)运算速度(A)2.世界上第一台电子计算机所采用的电子元件是( )。A)电子管 B)集成电路 C)晶体管 D)大规模及超大规模集成电路(B)3.第二代计算机使用的电子元件是( )。A)电子…

Win XP2实用的修复工具

个人收藏的三个经典Win XP2实用小工具转载于:https://blog.51cto.com/jinboychen/136639

14个超级牛X的免费开源小工具!

最近整理了一些在用的&#xff0c;感觉还不错的开源小工具&#xff0c;有的仅适用MacOS&#xff0c;但多数跨平台。 Homebrew Homebrew — The missing package manager for macOS&#xff1a;https://brew.sh&#xff0c;Mac上非常好用的包管理工具&#xff0c;很多常见的安装…

站在巨人的肩膀,2020我在使用和涉及到的开源项目

背景要想成为一名软件开发者需要学习各种专业知识、技术与框架。比如算法、数据结构、编程语言、流行框架等。但是要想成为更加出色的软件开发者&#xff0c;你要学习的就不仅仅是专业上的知识了。还要懂得利用巨人的肩膀。这是我2020使用和涉及到的开源项目&#xff0c;希望能…

硬件加速下webview切换闪屏_网页渲染性能优化 —— 性能优化下

博客 有更多精品文章哟。Composite 的优化 终于&#xff0c;我们到了像素管道的末尾。对于这一部分的优化策略&#xff0c;我们可以从为什么需要 Composited Layer&#xff08;Graphics Layer&#xff09;来入手。这个问题我们在构建 Graphics Layer Tree 的时候&#xff0c;已…

计算机和网络邻居都不见 了,网上邻居看不到自己和别人电脑怎么办

不少网友都试过&#xff0c;在局域网里面&#xff0c;打开网上邻居&#xff0c;结果里面一台电脑都没有&#xff0c;或者只能看到自己的&#xff0c;看不到其他人的&#xff0c;这是怎么回事呢&#xff1f;学习啦小编在这里教大家如何解决这个问题&#xff0c;希望能帮到大家。…