Asp.Net自定义IPrincipal和IIdentity实现用户验证

引言

前一段时间有两个朋友问我,为什么在HttpModule中无法获得到Session值,因为他们希望自定义一个 HttpModule,然后在其中获取Session来进行用户验证。我奇怪为什么不使用.Net Framework已经提供的 验证机制,而要和Asp时一样,自己手工进行cookie+Session验证?我们是基于.Net Framework这个平台 进行编程,所以我觉得,在很多情况下,使用Framework已经建立好的机制会显著地提高工作效率,而 且.NET Framework内置的验证机制通常也更加安全。

.Net提供了一整套的验证和授权机制,这里验证和授权是不同的概念,验证(Authentication)是指 “证明你确实是你所说的人”,通常是提供一个用户名和口令,然后与持久存储(比如数据库)中的用户名 和口令进行对比。授权(Authorization)是指“你是否有足够的权限做某件事”,此时你的身份已经被 证明过了(匿名用户、会员还是管理员),授权通常与用户组或者用户级别联系起来,不同的用户组拥有 不同的权限(访问特定页面或者执行特定操作)。

回想一下我刚接触.Net时,也曾经完全绕过.NET的验证,自己编码采用Cookie+Session实现身份验证 ,并且一个Asp.Net 登录控件都没有使用,那时候的理由是:我要使用自定义的用户表,不能使用 Asp.Net安全机制在App_Data下自动生成的AspNetDB.mdf中的一系列数据表。除此以外,还有一个原因, 就是.Net验证机制的核心IPrincipal和Identity提供的信息用户信息太少了,当在页面后置代码中使用继 承来的User属性(IPrincipal类型)时,它的Identity属性只有一个Name与用户数据相关 (AuthenticationType与IsAuthenticated都是与验证相关),而很多时候我们都需要许多额外的用户数据 。其实这只是一个误解罢了,以为使用Asp.Net的验证机制和登录控件就一定要使用其附带的数据表,以 为Identity就只能携带一个Name属性。

实际上,.NET的安全机制包括了几个部分,除了验证以外,还包括MemberShip、Profile、Role等,我 们完全可以只使用它的验证机制,而绕过它的MemberShip、Profile和Role,来实现通常我们用 Cookie+Session完成的功能,而且更高效更安全。这篇文章将快速地实现这样的一个流程。

开始前的准备

创建页面,配置Web.config

我们先创建解决方案、建立站点,然后在站点中添加下述文件,它们将会在后面使用:

时间: 2024-10-31 22:42:28

Asp.Net自定义IPrincipal和IIdentity实现用户验证的相关文章

Asp.Net 用户验证(自定义IPrincipal和IIdentity)

源码下载:http://www.tracefact.net/SourceCode/FormsAuthentication.rar 引言 前一段时间有两个朋友问我,为什么在HttpModule中无法获得到Session值,因为他们希望自定义一个HttpModule,然后在其中获取 Session来进行用户验证.我奇怪为什么不使用.Net Framework已经提供的验证机制,而要和Asp时一样,自己手工进行cookie+Session验证?我们是基于.Net Framework这个平台进行编程,所

艾伟:Asp.Net 用户验证(自定义IPrincipal和IIdentity)

源码下载:http://www.tracefact.net/SourceCode/FormsAuthentication.rar 引言 前 一段时间有两个朋友问我,为什么在HttpModule中无法获得到Session值,因为他们希望自定义一个HttpModule,然后在其中获取 Session来进行用户验证.我奇怪为什么不使用.Net Framework已经提供的验证机制,而要和Asp时一样,自己手工进行cookie+Session验证?我们是基于.Net Framework这个平台进行编程,

实现一个Asp.net自定义Back控件

asp.net|控件 本文讲述了如何给Web页面添加一个服务器端控件,从而将用户的浏览器重定向到该控件所指向的页面(referring page). by Juval Lowy Q:实现一个ASP.NET Back控件我想在ASP.NET页面中添加一个链接,通过它,我可以返回到它所指向的页面.不知怎样用一个服务器端控件来实现它呢?我想通过该控件返回到已访问过的页面,而并不想用浏览历史记录的方法. A:你可以用两种方法在一个Web页面上实现一个"Back"链接.第一种方法是用客户端脚本读

asp.NET自定义服务器控件内部细节

如大家要转载,请保留本人的版权:/* *Description:asp.NET自定义服务器控件内部细节系列教程*Auther:崇崇-天真的好蓝 *MSN:chongchong2008@msn.com *Dates:2007-05-20*Copyright:ChongChong2008 YiChang HuBei China */ 关于自定义asp.NET自定义服务器控件文章和源码示例网上已经很多了,不过有些内部些节方面,让一些初次接触这方面技术的朋友难以理解,对服务器控件的方方面面也很疑惑.为此

ASP.NET 2.0实现防止同一用户同时登陆

asp.net 要防止同一用户同时登陆,首页应该记录在线用户的信息(这里与用户名为例),然后判断正在登陆的用户里面是否已存在.在这里使用一个cache存放已经登陆的用户名,但是还有一个问题就是要知道用户是什么时候离开系统的呢?这就要定期清除cache中的内容了,也就是设置一个cache的时间.这个时间可以跟用户的session值联系起来,刚好当用户session值失效的时候该用户在cache里面的信息也会被清空.这样就达到了防止同时登陆的效果,具体代码如下: 放在登陆成功的地方: string

Asp.Net其他页面如何调用Web用户控件写的分页

  这篇文章主要介绍了Asp.Net其他页面如何调用Web用户控件写的分页,需要的朋友可以参考下 在要添加分页的页面加载时添加以下代码:(以图书分类为例) Paging p = Paging1; //Web用户控件的ID p.DataControl = gvBookType; //要绑定数据的控件(此处是GridView) p.TableName = "BookShop_BookType"; p.Sort = "asc"; p.Column = "Book

aspnet自定义请求-ASP.NET自定义一个请求成功发送,为什么服务器无法拿到数据

问题描述 ASP.NET自定义一个请求成功发送,为什么服务器无法拿到数据 场景:服务端套件要求客户端必须携带安全令牌,所以需要在客户端的请求报文头中植入一个安全令牌(也就是一个键值对),那么就不能使用HTML的表单进行提交,我需要自定义一个请求. 所以我用到了webrequest,代码如下: public class Handler : IHttpHandler { public void ProcessRequest (HttpContext context) { context.Respon

asp 操作表格行-ASP 如何获取在运行时由用户添加的表格行中单元格控件中的值?

问题描述 ASP 如何获取在运行时由用户添加的表格行中单元格控件中的值? 如图中,用户点击添加或移除按钮后,即可增加或删除一行.增加的新行就是当前最后一行的克隆行.(这部分代码JS都已实现).而"提交申请"就是将当前表格中的所有内容提交保存到数据库.**而我要问的是,由JS克隆新增加的行中各个单元格里控件的值如何获取提交?** 附:表格增加行或删除行的JS代码如下: function addRow() { var oTr = document.getElementById("

ASP.NET MVC中加载WebForms用户控件(.ascx)

原文:ASP.NET MVC中加载WebForms用户控件(.ascx) 问题背景 博客园博客中的日历用的是ASP.NET WebForms的日历控件(System.Web.UI.WebControls.Calendar),它会为"上一月"."下一月"的链接生成"__doPostBack()"的js调用,如下图: 目前发现它会带来两个问题: 1. 不支持IE10: 2. 某些电脑不允许执行__doPostBack. 问题提炼 前提: 我们想以最低