当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > ASP.NET MVC :MVC页面验证与授权

ASP.NET
ASP.NET开发:简化应用程序的开发支持Web标准
asp.net XMLHttpRequest实现用户注册前的验证
asp.net 页面间传值方法小结
asp.net url重写浅谈
asp.net 验证码生成和刷新及验证
C#精髓 GridView72大绝技 学习gridview的朋友必看
实例说明asp.net中的简单角色权限控制
asp.net网站开发包wq.dll打包下载
js与ASP.NET 中文乱码问题
asp.net checkbox 动态绑定id GridView删除提示
asp.net TextBox回车触发事件 图片在img显示
asp.net 脏字典过滤问题 用正则表达式来过滤脏数据
asp.NET 脏字过滤算法
asp.NET 脏字过滤算法 修改版
asp.net sql 数据库处理函数命令
asp.net Javascript 的几种写法与提示
ASP.NET MVC学习笔记
asp.net 中国身份证号码验证代码 非正则
Asp.net中使用Sqlite数据库的方法
asp.net 中文字符串提交乱码的解决方法

ASP.NET MVC :MVC页面验证与授权


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-23   浏览: 315 ::
收藏到网摘: n/a

在ASP.NET MVC中,如何来实现表单的验证与授权访问呢?至少在CTP3中,还没有一个官方的解决方案。ASP.NET WebForm的表单验证和授权机制是否适合在ASP.NET MVC中使用呢?带着这些问题来进入我们今天的主题。
 在ASP.NET WebForm的架构下,我们可以通过一定的配置即可实现用户身份验证和授权。特别是在ASP.NET 2.0的Membership功能的支撑下,可以做到更加简洁可复用的用户验证系统。通过web.config可以做到对页面或目录对不同用户身份可见性的定制,但是它是基于物理文件和目录。而在ASP.NET MVC架构下,用户访问的每一个页面在磁盘中并没有一个固定的物理文件,它是通过Controller控制数据与视图的组合来生成HTML代码,进而向客户端输出。那么我们该如何来复用已有的表单验证授权机制呢?

在MVC中,请求的功能入口是Controller相应的Action函数,我们可以在函数执行前去控制请求权限。在ASP.NET MVC Preview 2后,提供了一个机制让我们可以对Action的AOP拦截,这个接口定义如下:           public interface IActionFilter

以下为引用的内容:
         {
             void OnActionExecuted(ActionExecutedContext filterContext);
             void OnActionExecuting(ActionExecutingContext filterContext);
             void OnResultExecuted(ResultExecutedContext filterContext);
             void OnResultExecuting(ResultExecutingContext filterContext);
         }

我们有两种方式来实现拦截,一种我们可以通过定义Attribute来实现拦截的功能,在System.Web.Mvc程序集中有一个ActionFilterAttribute抽象类,通过重写这个抽象类的这些虚方法,我们就可以实现对特定的执行过程进行拦截。

另一种方法,我们注意到Controller这个类也实现了IActionFilter这个接口,并且也提供了这四个函数的虚拟方法定义。框架内部,在调用Action方法的时候同时来调用这些拦截方法。具体的可以参考:ControllerActionInvoker 这个类的实现,所有的Action的调用都在这个类当中被实现。所以我们只要重写Controller里这四个虚方法,也可完成本Controller面的所有Action的拦截。

在这里,我也找到了国外友人已经实现好的基于角色的MVC权限控制的方案。

自定义了两个自定义Attribute,分别为:RequiresAuthenticationAttribute和RequiresRoleAttribute。通过这两个Attribute来可以作用于Class和Method,用标记哪些Controller或Action需要登录后,或者需要拥有哪些角色才能执行。如果用户没有拥有访问当然Controller或Action权限的时候,就会自动被重定向到登录页面去。下面是两个类的定义:

以下为引用的内容:
         /// <summary>
        /// Checks the User's authentication using FormsAuthentication
        /// and redirects to the Login Url for the application on fail
        /// </summary>
        [RequiresAuthentication]
        public class RequiresAuthenticationAttribute : ActionFilterAttribute
        {
            public override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                //redirect if not authenticated
                if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
                {
                    //use the current url for the redirect
                    string redirectOnSuccess = filterContext.HttpContext.Request.Url.AbsolutePath;
                    //send them off to the login page
                    string redirectUrl = string.Format("?ReturnUrl={0}", redirectOnSuccess);
                    string loginUrl = FormsAuthentication.LoginUrl + redirectUrl;
                    filterContext.HttpContext.Response.Redirect(loginUrl, true);
                }
            }
        }