[asp.net]Forms验证的过程

转载 2006年06月15日 12:45:00
在web.config里做好设定,在ui层做好反应机制,接下来就可以把自己的web程序交给Forms验证来保护了,下面就来看Forms验证发挥作用的过程。
首先,每当我们发送一个页面的请求,都会激发数个应用程序级(Application)的事件,其中和用户验证有关的是AuthenticateRequest,打开Global.asax.cs就可以看到它
void Application_AuthenticateRequest(Object sender, EventArgs e)
每次请求发送过来,都会进入这个处理方法里面,我们可以加入以下的代码,然后在第一句的位置设置断点,来查看一下他们的值,这样就会有清晰的认识啦
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
   //获得请求发送者 
   HttpApplication app=(HttpApplication)sender;
   // 检查是否通过验证 
   if(app.Request.IsAuthenticated)
   {
      //在这里查看类型
      if(app.Context.User is System.Security.Principal.GenericPrincipal)
         if(app.Context.User.Identity.Name=="xx")
         {}
   }
}

从第一句那里就设断点,然后用f10步进查看各个的值,也可以把那些重要的添加到监视,比如app.Context.User和app.Context.User.Identity
先说一下app.Context.User就相当于我们在ui层里使用的this.User。
当请求第一次发过来的时候,也就是没有通过验证的时候,这个时候是没有调用FormsAuthentication.SetAuthCookie()的,注意看app.Context.User“未定义的值”,而app.Context.User.Identity根本不存在。
然后进入login.aspx, 填好信息后,提交,检查信息,若有问题,则打回去,否则就调用FormsAuthentication.SetAuthCookie将用户凭证赋给当前用户
通过验证后,再次进入该方法,这时监视窗口里的信息为:
app.Context.User 
{System.Security.Principal.GenericPrincipal} 
System.Security.Principal.IPrincipal

app.Context.User.Identity 
{System.Web.Security.FormsIdentity} 
System.Security.Principal.IIdentity

很明显,在获得用户凭证后,app.Context.User是GenericPrincipal类型,而app.Context.User.Identity是FormsIdentity类型。
GenericPrincipal的Identity返回一个实现IIdentity接口的对象,具体返回的值就看你在web.config里的设定,在这里当然就是返回FormsIdentity

再接着往下想,一开始我们是用app.Request.IsAuthenticated检查,通过反射器查看的该方法的实现为:
public bool IsAuthenticated
{
   get
   {
      if ((this._context.User != null) && (this._context.User.Identity != null))
      {
         return this._context.User.Identity.IsAuthenticated;
      }
      return false;
   }
}

这就是为什么不直接用app.Context.User.Identity.IsAuthenticated的原因,因为它在里面替我们检查了app.Context.Use是否已经存在,而实际上,如果app.Context.User存在了,那肯定是通过验证了,即调用了FormsAuthentication.SetAuthCookie()方法,下面是其实现:
public static void SetAuthCookie(string userName, bool createPersistentCookie)
{
   FormsAuthentication.Initialize();
   FormsAuthentication.SetAuthCookie(userName, createPersistentCookie, FormsAuthentication.FormsCookiePath);
}

public static void SetAuthCookie(string userName, bool createPersistentCookie, string strCookiePath)
{
   FormsAuthentication.Initialize();
   HttpContext.Current.Response.Cookies.Add(FormsAuthentication.GetAuthCookie(userName, createPersistentCookie, strCookiePath));
}

我们大多使用的是重载的第一个方法,它在里面调用了第二个方法,最关键的就是设定cookie那句啦,而不难想到,在Initialize()肯定是有对app.Context.User的初始化。

汗……我发现我的表达能力越来越差了,再说下去恐怕自己都糊涂了,就在这里结尾吧。下面是我的总结:
当用户没有通过验证时,一切都没有发生,根据web.config里各location的权限设定来加以保护,一旦用户填写完login.aspx的表单提交,并且通过验证,则调用FormsAuthentication.SetAuthCookie(),在这个方法里,设定了表示用户凭证的cookie,并且重新设定了Context的实例,以后就可以直接通过该Context的实例获得对实现IPrincipal接口的GenericPrincipal对象和实现IIdentity接口的FormsIdentity对象的访问。
絮絮叨叨的写了这么多,不知大家明白了没有……其实认识这个过程,关键是为使用自己的验证体系做准备,当我们要自己实现IPrincipal和IIdentity来使用自定义的验证体系时,比如分别是REDPrincipal和REDIdentity,那就要考虑转换的问题,因为默认是转成了GenericPrincipal和FormsIdentity。而转换的最佳地点就是在Application_AuthenticateRequest()方法里。
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
   HttpApplication app=(HttpApplication)sender;
   if(app.Request.IsAuthenticated)
   {
      if(!(app.Context.User is Business.RedPrincipal))
      {
         app.Context.User=new Business.RedPrincipal(app.Context.User.Identity.Name);
      }
   }
}

相关文章推荐

ASP.NET基于Forms身份权限验证

1、创建一个网站,结构如下: 网站根目录 Admin目录 ----> 管理员目录 Manager.aspx ----> 管理员可以访问的页面 Users目录 ----> 注册用户目录 W...

Asp.net Forms身份验证

前言:     因为自己一直从事企业内部系统开发,一直将登陆用户信息保存在Session中.没有用过什么Forms身份验证,最近研究了一下这方面的东西,贴一下,欢迎大家拍砖. Froms身份验证:...

Asp.Net的Forms验证,解决Cookie和Seesion失效时间

  网站开发中用户验证一般采用Asp.Net的Forms验证,验证票据存储到Cookie的方式。     Session方式是将验证信息存储在内存中,如果你使用的虚拟主机给你分配很小的内存,实际上都...
  • logo616
  • logo616
  • 2011年05月13日 11:07
  • 1163

ASP.NET安全问题--Forms验证(后篇)--实战篇

验证流程讲述        我们首先假设一个场景:用户现在已经打开了我们的首页Default.aspx,但是有些资源只能是登录用户才可以看到的,那么如果这个用户想要查看这些资源,那么他就要登录。而且...

Asp.Net Forms验证(自定义、角色提供程序、单点登录)

Asp.Net Forms验证(自定义、角色提供程序、单点登录) 以前开发项目时经常是自己开发一套用户权限管理系统进行验证,比较灵活。最近为了单点登录的问题又把Asp.Net...

asp.net FormsAuthenticationTicket基于forms的验证

1,设置IIS为可匿名访问和asp.net web.config中设置为form验证2,检索数据存储验证用户,并检索角色(如果不是基于角色可不用)3,使用FormsAuthenticationTick...

asp.net Forms身份验证详解

在做网站的时候,都会用到用户登录的功能。对于一些敏感的资源,我们只希望被授权的用户才能够访问,这让然需要用户的身份验证。对于初学者,通常将用户登录信息存放在Session中,笔者在刚接触到asp.ne...

asp.net登录 用Forms身份验证和基于角色的分目录访问

Forms身份验证用来判断是否合法用户,当用户合法后,再通过用户的角色决定能访问的页面。主要思想:Forms身份验证用来判断是否合法用户,当用户合法后,再通过用户的角色决定能访问的页面。 具体步骤: ...

ASP.NET Forms权限验证

本文PDF下载 安全性是 ASP.NET Web 应用程序中一个非常重要的方面。它涉及内容非常广泛,不能在一篇文章内说明所有的安全规范,本文讲述如何利用Forms 身份验证构建安全的 ASP.NET...

Asp.Net基于forms的验证机制

项目需要研究了下Asp.Net的基于forms的验证机制   构建基于forms的验证机制过程如下:   1,设置IIS为可匿名访问和asp.net web.config中设置为form验证...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[asp.net]Forms验证的过程
举报原因:
原因补充:

(最多只允许输入30个字)