zoukankan      html  css  js  c++  java
  • ASP.NET MVC :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);
                    }
                }
            }

  • 相关阅读:
    hdu 2639 Bone Collector II
    文件打包bundle
    iOS UITextField垂直居中
    Mac删除废纸篓中的单一文件和文件夹
    Swift 初见
    关于 Swift
    NSString和NSDate的转换
    iOS开发之iOS7设置状态栏字体颜色
    在当前界面中隐藏状态栏
    适合所有测试人员读的书籍
  • 原文地址:https://www.cnblogs.com/sobaby/p/1378893.html
Copyright © 2011-2022 走看看