首页 新闻 会员 周边 捐助

ASP.NET MVC 中的过滤器底层执行过程

0
悬赏园豆:10 [已解决问题] 解决于 2012-12-03 16:49

在访问一个控制器A的时候我做了一个过滤器Fx,实现了IAuthorizationFilter接口,继承了FilterAttribute类,里面有个Role属性。我在控制器A上面标注了[Fx(Role="admin")],当某用户访问到A控制器的时候它首先会进入过滤器Fx中去执行OnAuthorization这个方法。我就想知道我标注了(Role=“admin”)指定的是管理员能访问的,那么在OnAuthorization里面怎么判断当前访问的用户是管理员还是普通用户呢?我用反编译控件看底层也看不见是怎么实现的,求大神指导

下面是我的想法---------------------------------

我的想法是在用户登录的时候在后台验证用户名和密码来判断角色的,如果是普通用户登陆成功就设置session["user"]=user1,(一个User类的实例--当前登录用户)。如果是管理员登陆成功就设置session["admin"]=admin1,(一个Admin类的实例---当前登录用户)。然后在过滤器Fx中的OnAuthorization方法里面根据标注的Role属性来判断是管理员的话然就就检测当前上下文中的session["admin"]是否为空,不为空转入指定的页面(后台管理页面),若是空的话就跳到指定的另外一个页面。

希望多这个过滤器底层的大神指导一下,我这个思路有没有问题谢谢了

让手指在键盘上飞舞的主页 让手指在键盘上飞舞 | 初学一级 | 园豆:82
提问于:2012-11-30 14:14
< >
分享
最佳答案
0

HttpContext.Current.User

收获园豆:10
Launcher | 高人七级 |园豆:45050 | 2012-11-30 14:20

我知道这个。我只是想知道过滤器执行过程是不是可以按我说的这样理解

让手指在键盘上飞舞 | 园豆:82 (初学一级) | 2012-11-30 14:31

@让手指在键盘上飞舞: MVC中默认的实现授权的类是 AuthorizeAttribute,继承自 FilterAttribute 和 IAuthorizationFilter。要查看实现的话,可以看 AuthorizeAttribute 的类实现。

Launcher | 园豆:45050 (高人七级) | 2012-11-30 16:25

@让手指在键盘上飞舞: 除非特别的需求,否则我们不会直接自定义 AuthorizeAttribute,而是通过自定义MemberShipProvider来实现自己的身份验证和授权。在程序中我们会使用 User 来得到已通过验证的用户身份信息,而不会使用 session 来做。

Launcher | 园豆:45050 (高人七级) | 2012-11-30 16:28

@Launcher: 我用反编译工具查看这个类的实现好像看不到,微软封闭了~~~

让手指在键盘上飞舞 | 园豆:82 (初学一级) | 2012-12-03 08:42

@Launcher: 谢谢你了啊,今天仔细看了一下mvc3中自己生产的那个Accountcontroller中自动生成的代码,基本过程明白了一些,不过我在某个controller上标注了Role=“Admin”,指定这个控制器只能有角色为Admin的用户才能访问,那么我在何处来为当前登录成功的用户指定角色呢?求大神指导~~~非常3Q

让手指在键盘上飞舞 | 园豆:82 (初学一级) | 2012-12-03 11:29

@让手指在键盘上飞舞:我不知道你如何做的验证,所以我不能给出具体的指导,我可以告诉你的是安全体系是怎样的,HttpContext.Current.User 实现了 IPrincipal,IPrincipal有定义了 IIdentity 接口,通过验证后的 User 会被实例化为具体的 Principal(例如:GenericPrincipal,WindowsPrincipal),允许你自定义 IPrincipal和IIdentity。

Launcher | 园豆:45050 (高人七级) | 2012-12-03 11:55

@Launcher: 我看MVC3自己生产的那个AccountController中的控制器LogOn中的 FormsService.SignIn(model.UserName, model.RememberMe) 这个方法就是为当前登录用户创建身份验证票证。它内部是用FormsAuthentication.SetAuthCookie(userName, createPersistentCookie)这个方法来实现的。那在过滤器的OnAuthorization()方法中的AtuhorizeCore()方法里面Httpcontext.User就是获取之前创建身份验证票证的用户吗???

让手指在键盘上飞舞 | 园豆:82 (初学一级) | 2012-12-03 15:49

@让手指在键盘上飞舞: 是,MVC默认使用的是MemberShip和SqlRoleProvider。

Launcher | 园豆:45050 (高人七级) | 2012-12-03 15:51

@嗯,MemberShip这个对象就是提供一些方法去数据源中查询数据的吧?

让手指在键盘上飞舞 | 园豆:82 (初学一级) | 2012-12-03 16:06

@让手指在键盘上飞舞: 它里面的方法好像是调用数据库中的存储过程的吧?如果是这样的话那我用EFCodeFirst的时候自动生成数据库的时候会在数据库中自动创建这些存储过程吗?

让手指在键盘上飞舞 | 园豆:82 (初学一级) | 2012-12-03 16:09

@让手指在键盘上飞舞: 请你自己去学习下MemberShip,包括如何自定义MemberShip。Asp.Net MVC默认使用MemberShip来完成验证和授权。

Asp.Net在使用MemberShip或别的方式(Windows身份验证)验证成功后会为当前上下文创建IPrincipal,当然这个创建的过程,你同样可以自定义。假设当前使用的是MemberShip,认证通过后,Asp.Net的授权过程会使用SqlRoleProvider来为当前用户授权。

Launcher | 园豆:45050 (高人七级) | 2012-12-03 16:37

@Launcher: 大神非常3Q

让手指在键盘上飞舞 | 园豆:82 (初学一级) | 2012-12-03 16:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册