今天遇到一个需求,就是对Order文件夹下所有页面的访问进行权限控制,仅允许某些角色访问!
项目的权限验证是基于微软的MemberShip的,所以一开始就想到在该文件夹下加一个web.config,设置角色。
这样显然是没什么问题的。很简单地解决了问题。
但是这样有一个不好的用户体检:当角色不对的用户访问时,页面自动跳到login.aspx。
但其实我只是想提示一下“权限不够”而以,不必跳到login.aspx。
只是已经在web.config中写死了,如图2所示,该怎么办呢?
google了一下,发现httpModule可以解决问题。
所有的请求都会经过httpModule这个环节
,具体的原理一时也难以理解,详见http://www.cnblogs.com/luckboy/archive/2009/07/07/1518182.html
代码如下,很简单
View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Security;
namespace Cnblogs
{
public class CustomAuthrizationModule : IHttpModule
{
public void Dispose() { }
public void Init(HttpApplication context)
{
context.AcquireRequestState += new EventHandler(context_AcquireRequestState);
}
void context_AcquireRequestState(object sender, EventArgs e)
{
HttpApplication context = (HttpApplication)sender;
if (string.IsNullOrEmpty(context.User.Identity.Name))
{
return;
}
string url = context.Request.Url.ToString().ToLower();
string role=string.Empty;
if (context.Session != null&&context.Session["Role"]!=null)
{
role= context.Session["Role"].ToString();
}
if (url.IndexOf("/administrator/") > 0&&role!="Administrator")
{
context.CompleteRequest();
context.Response.Write("你无权访问此页面");
}
}
}
}
但是文章都是说一半不说一半,都是说出关键代码,至于流程怎么操作却没有说到。
像我这等新手看了貌似懂,其实什么也不懂,不知从何做起。
好在摸索了一阵子,终于搞明白整个流程了。
写下来希望新手看了直接上手,不必走弯路,同是也请大家多多指教!
既然所有的URL请求都会到达httpModule这里,那么我们就可以在这里去判断一个Url访问那里,用户角色如何等
那又为什么要在httpModule里面去判断,而不在其它事件去判断呢,我也不怎么明白。
先把功能做出来,回头再理解它,呵呵!
大概流程就是这样:
1:建一个类,继承IhttpModule,重写其中的一些方法,添加我们的业务逻辑代。
2:把这个类编译成DLL,在项目中引用它。
3:在项目最根的web.config文件中注册这个DLL,使它起作用
好了,我们开始吧。
建创项目并钩上“解决方案”,
加添文件夹和一些页面,并设置场景,我们这里的场景是:
角色为Administrators的用户可以访问文件夹Admin和Administrator的所有页面,
角色为Admin的用户只能访问文件夹Admin的页面,却不能访问文件夹Administrator下面的页面
当访问者的角色不符合时,我们给予消息提示,或者自定义跳转等操作,而不必跳到login.aspx
我们首先开启Forms验证,接着为文件夹Admin、Administrator、UserCenter添加web.config文件,登录后才能访问
好了,基本的场景已经建好了,如图所示.
现在开始我们的流程
1:建一个类,继承IhttpModule,重写其中的一些方法,添加我们的业务逻辑代。
这一步有很多种做法,例如建一个程序集,并引用,这样不用我们手动去编译文件
或者建一个.cs文件,写好代码,用VS的命令提示符来编译这个文件,并引用,但这样做手动要做挺多的.
我们选择建程序集这种方法.
右击解决方案,新工程=>程序集,命名为CustomAuthrizationModule。
默认生成一个Class1的类文件,我们把他改为CustomAuthrizationModule.
我们为程序集CustomAuthrizationModule加添web.dll引用


CustomAuthrizationModule.cs代码如下:

2:把这个类编译成DLL,在项目中引用它。
我们引用这个程序集,右击HttpModuleTest2,点击“添加引用”,在工程选项卡选择刚才建好的程序集。如图

引用成功如图所示

3:在项目最根的web.config文件中注册这个DLL,使它起作用
如图所示

好了,同时按下组合键编译:Ctrl+Shift+B编译整个项目
我们来运行一下






