[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验证详解

创建网站中,常常会使用到身份验证。asp.net中内置了几种身份验证的方式,如Windows、Froms、Passport等。这几种身份验证的方式各有不同。一般来说,网站的身份验证方式都会经过以下几个...
  • moonpure
  • moonpure
  • 2015年04月25日 15:23
  • 2047

ASP.NET Forms 身份验证

ASP.NET Forms 身份验证 ASP.NET Forms 身份验证 概述 ...
  • apinghappy
  • apinghappy
  • 2007年07月18日 10:30
  • 1122

asp.net mvc forms身份认证

web.config配置 增加一个Attribute类,继承自AuthorizeAttributepublic class CustomAu
  • letmefish
  • letmefish
  • 2016年08月10日 16:44
  • 1904

Forms身份验证基本原理

要采用Forms身份验证,先要在应用程序根目录中的Web.config中做相应的设置:              标签中的name表示指定要用于身份验证的HTTP Cookie(即指定Cooki...
  • guanglovemiao
  • guanglovemiao
  • 2014年02月21日 11:40
  • 2337

ASP.NET身份验证过滤页面

在开发中我们经常用到某些页面不允许匿名用户登陆的功能.设置某些页面不允许匿名登陆,和匿名时跳转的页面xml version="1.0" encoding="utf-8" ?>configuration...
  • lhypang2006
  • lhypang2006
  • 2007年08月25日 12:55
  • 579

Forms验证的过程

在web.config里做好设定,在ui层做好反应机制,接下来就可以把自己的web程序交给Forms验证来保护了,下面就来看Forms验证发挥作用的过程。首先,每当我们发送一个页面的请求,都会激发数个...
  • xiaoxiaohai123
  • xiaoxiaohai123
  • 2007年08月02日 16:09
  • 549

Forms验证的过程

在web.config里做好设定,在ui层做好反应机制,接下来就可以把自己的web程序交给Forms验证来保护了,下面就来看Forms验证发挥作用的过程。首先,每当我们发送一个页面的请求,都会激发数个...
  • niki190
  • niki190
  • 2007年01月08日 11:50
  • 555

关于Forms 验证的完整解决方案

关于Forms 验证的完整解决方案代码! 下载地址: http://files.cnblogs.com/enric1985/LogSite-CustomSetting.rar 希望对于大家...
  • nic7968
  • nic7968
  • 2014年03月10日 04:29
  • 922

ASP.net Logion用户登陆验证代码

web.configconfiguration>……system.web>       database>        add key="strConn" value="server=107.120...
  • bridgehead
  • bridgehead
  • 2006年12月01日 23:24
  • 820

ASP.NET网站Forms验证

使ASP.NET网站Forms验证可以指定多个登录页面(转自yicone) Posted on 2008-05-27 12:01 codingsilence 阅读(52) 评论(0)  编辑 收藏 ...
  • zlb789
  • zlb789
  • 2008年09月24日 11:59
  • 405
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[asp.net]Forms验证的过程
举报原因:
原因补充:

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