HttpModule实现用户身份验证
2009-06-21 17:40
459 查看
(本文资源全部来自于园子里各牛)
之前看jimmyzhang的asp.net运行原理,开篇既说要明白验证就要先看asp.net运行原理,不然用控件就是"微软的用户"了
现在看到这总算反应过来,原来验证是在HttpModule里进行的(目前观点).
首先来看一下HttpModule的生命周期Code
public class SystemModuleAuthorizationModule : IHttpModule
{
public void Dispose() { }
public void Init(HttpApplication context)
{
context.AcquireRequestState += new EventHandler(context_AcquireRequestState);
}
void context_AcquireRequestState(object sender, EventArgs e)
{
HttpApplication application = (HttpApplication)sender;
// 如果用户未登录,则无需检查模块授权,因为请求会被用户登录Module重定向到登录页面。
if (application.Session["UserName"] == null)
return;
// 获取用户名和Url
string userName = application.Session["UserName"].ToString();
string url = application.Request.Url.ToString();
// 如果用户没有被授权,请求被终止,并打印提示信息。
if (!Validator.CanUseModule(userName, url))
{
application.CompleteRequest();
application.Response.Write(string.Format("对不起!{0},您无权访问此模块!", userName));
}
}
}
public class Validator
{
public static bool CanUseModule(string userName, string url)
{
if (!url.Contains("模块"))
return true;
else if (userName == "文野" && url.Contains("模块1"))
return true;
else if (userName == "stwyhm" && url.Contains("模块2"))
return true;
else
return false;
}
}
在webconfig注册完成后,就可以运行看看效果了(页面上的关于session代码肯定再熟悉不过了).
这里两个自定义的HttpModule实现了它们各自所要达到的过滤请求的功能,一个限制用户登录,一个限制模块访问,当然实际应用中比这要复杂许多。这样的验证方式是简单的、安全的,代码在修改时只要修改相应的HttpModule就可以了,无需在每个页面都写相同的验证代码,也不会发生在Url地址栏里输入一段Url就可以跳过登录及其它验证的情况了。在这两个HttpModule中,因为都要涉及到对Session的访问,所有都使用了AcquireRequestState事件
一个完整的HTTP请求在ASP.NET Framework的处理过程如下:
HttpRequest ——> inetinfo.exe ——> ASPNET_ISAPI.dll ——> Http Pipeline ——> ASPNET_WP.exe ——> HttpRuntime ——> HttpApplication Factory ——> HttpApplication ——> HttpModule ——> HttpHandler Factory ——> HttpHandler ——> HttpHandler.ProcessRequest()
HTTP Handler提供了类似于ISAPI Server Extention的功能,而HttpModule实现了类似于ISAPI Filter的功能。使用自定义的Handler会覆盖系统默认的Handler,而Module是可以多个同时存在的。
之前看jimmyzhang的asp.net运行原理,开篇既说要明白验证就要先看asp.net运行原理,不然用控件就是"微软的用户"了
现在看到这总算反应过来,原来验证是在HttpModule里进行的(目前观点).
首先来看一下HttpModule的生命周期Code
public class SystemModuleAuthorizationModule : IHttpModule
{
public void Dispose() { }
public void Init(HttpApplication context)
{
context.AcquireRequestState += new EventHandler(context_AcquireRequestState);
}
void context_AcquireRequestState(object sender, EventArgs e)
{
HttpApplication application = (HttpApplication)sender;
// 如果用户未登录,则无需检查模块授权,因为请求会被用户登录Module重定向到登录页面。
if (application.Session["UserName"] == null)
return;
// 获取用户名和Url
string userName = application.Session["UserName"].ToString();
string url = application.Request.Url.ToString();
// 如果用户没有被授权,请求被终止,并打印提示信息。
if (!Validator.CanUseModule(userName, url))
{
application.CompleteRequest();
application.Response.Write(string.Format("对不起!{0},您无权访问此模块!", userName));
}
}
}
public class Validator
{
public static bool CanUseModule(string userName, string url)
{
if (!url.Contains("模块"))
return true;
else if (userName == "文野" && url.Contains("模块1"))
return true;
else if (userName == "stwyhm" && url.Contains("模块2"))
return true;
else
return false;
}
}
在webconfig注册完成后,就可以运行看看效果了(页面上的关于session代码肯定再熟悉不过了).
这里两个自定义的HttpModule实现了它们各自所要达到的过滤请求的功能,一个限制用户登录,一个限制模块访问,当然实际应用中比这要复杂许多。这样的验证方式是简单的、安全的,代码在修改时只要修改相应的HttpModule就可以了,无需在每个页面都写相同的验证代码,也不会发生在Url地址栏里输入一段Url就可以跳过登录及其它验证的情况了。在这两个HttpModule中,因为都要涉及到对Session的访问,所有都使用了AcquireRequestState事件
一个完整的HTTP请求在ASP.NET Framework的处理过程如下:
HttpRequest ——> inetinfo.exe ——> ASPNET_ISAPI.dll ——> Http Pipeline ——> ASPNET_WP.exe ——> HttpRuntime ——> HttpApplication Factory ——> HttpApplication ——> HttpModule ——> HttpHandler Factory ——> HttpHandler ——> HttpHandler.ProcessRequest()
HTTP Handler提供了类似于ISAPI Server Extention的功能,而HttpModule实现了类似于ISAPI Filter的功能。使用自定义的Handler会覆盖系统默认的Handler,而Module是可以多个同时存在的。
相关文章推荐
- HttpModule实现用户身份验证
- 使用HttpContext的User属性来实现用户身份验证
- 使用HttpContext中的User属性来实现用户身份验证之用户验证票篇
- HttpMoudle实现用户身份验证
- 使用HttpContext中的User属性来实现用户身份验证之用户验证票篇
- 4.2用户登陆和安全验证(利用HttpModule集中处理身份检查)
- 利用HttpModule和forms身份验证,实现角色验证控制
- 使用HttpContext的User属性来实现用户身份验证
- 使用HttpContext中的User属性来实现用户身份验证之用户验证票篇[转载]
- 使用HttpContext的User属性来实现用户身份验证
- 分别用(Windows/Form/Soap/WebService)实现用户身份验证(含示例代码下载)
- 实现带有用户身份验证的文件传输Web Service(1)
- 实现带有用户身份验证的Web Service
- 用Lighttpd加脚本实现服务器端可进行身份验证的HTTP断点续传下载
- Web用户的身份验证及WebApi权限验证流程的设计和实现
- 实现带有用户身份验证的文件传输Web Service(2)
- 通过基类,轻松实现部分页面自动验证用户身份。
- HttpModule用户的验证
- 使用HttpContext的User属性来实现用户验证