2.身份验证模块
身份验证是利用ASP.NET中的身份验证模块来实现的。在ASP.NET中内置有四个验证模块:
DefaultAuthenticateModule,FormsAuthenticateModule,WindowsAuthenticateModule,PassportAuthenticateModule.他们都实现了IHttpModule接口,当然,如果需要,我们也可以实现自定义的验证模块。
从验证模块就可以看出我们一般的身份验证是怎么进行的,决定采用个验证模块是由我们决定采用哪种身份验证决定的,如Forms验证就是用了FormsAuthenticateModule来处理的。而且还要配置web.config文件中的<authentication/>元素。
下面我们就先来看看身份验证模块的实现(伪码)
{
#region IHttpModule 成员
public void Dispose()
{
throw new NotImplementedException();
}
public void Init(HttpApplication context)
{
context.AuthenticateRequest += new EventHandler(context_AuthenticateRequest);
}
public event FormsAuthenticationEventHandler Authenticate;
#endregion
}
大家可以看到,其实在模块的Init方法中就订阅了AuthenticateRequest事件,而我们在Global.asax中写的代码就是我们具体处理的代码:
{
//自定义验证代码
}
还有一点要注意的就是:每个模块都有一个Authenticate事件。
下面就说说常用的两个个验证模块,因为大同小异:
WindowsAuthenticateModule:
WindowsAuthenticateModule是和IIS身份验证联合试用的,当web.config 的中配置如下:
此时,这个模块就激活了,在Global.asax文件中就的Application_Authenticate(object sender,eventArgs e)就是给Windows验证用的。
这里有一个问题要澄清:如果是我们配置的是Windows身份验证,我们在Application_Authenticate中就只能写和Windows身份验证有关的代码,如果是配置的是Forms验证,我们在Application_Authenticate就只能写和Forms有关的代码,如获取cookie信息等。也就是说,Application_Authenticate方法是"一法多用"。
接着谈 Windows验证,在上面的处理程序中,我们可以创建自己的用户信息,如我们创建一个WindowsPrincipal类的实例(实现了IPrincipal接口,包含用户名和角色的信息),然后它赋值给 HttpContext.User属性。这正如我们之前说的,验证事件执行完之后,我们就知道了这个请求的发起者的用户名和角色信息。
FormsAuthenticateModule:
首先还是要配置:<authentication mode="Forms"/>.
FormsAuthenticateModule可以利用cookie解析保存在cookie中的用户的信息,并且创建一个GenericPrincipal,把用户名和角色信息保存在其中,然后赋值给User属性,以备后用。