ASP.NET MVC页面验证与授权

发表于:2008-7-17 11:59

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:网络转载

#
ASP
#
MVC

        在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);
           }
       }
}

 

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号