ASP.NET MVC :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拦截,这个接口定义如下:

  1: public interface IActionFilter

  2: {

  3: void OnActionExecuted(ActionExecutedContext filterContext);

  4: void OnActionExecuting(ActionExecutingContext filterContext);

  5: void OnResultExecuted(ResultExecutedContext filterContext);

  6: void OnResultExecuting(ResultExecutingContext filterContext);

  7: }

  我们有两种方式来实现拦截,一种我们可以通过定义Attribute来实现拦截的功能,在System.Web.Mvc程序集中有一个ActionFilterAttribute抽象类在这里,我也找到了国外友人已经实现好的基于角色的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);
}
}
}
/// <summary>
/// Checks the User's role using FormsAuthentication
/// and throws and UnauthorizedAccessException if not authorized
/// </summary>
public class RequiresRoleAttribute : ActionFilterAttribute
{
public string RoleToCheckFor { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//redirect if the user is not authenticated
if (!String.IsNullOrEmpty(RoleToCheckFor))
{
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);
}
else
{
bool isAuthorized = filterContext.HttpContext.User.IsInRole(this.RoleToCheckFor);
if (!isAuthorized)
throw new UnauthorizedAccessException("You are not authorized to view this page");
}
}
else
{
throw new InvalidOperationException("No Role Specified");
}
}
}


  如上所介绍的两种方法,我们一样可以定义一个Controller基类,通过拦截来进行权限的控制。但是与定义Attribute相比,手法并不是很好,也不利于通用化。但是就理论上的性能来说,会比Attribute更好。

  到目前为止,ASP.NET MVC还没有更新的消息,我想在正式版本的ASP.NET MVC框架,权限控制问题会有一个官方说法。希望到时候会有一种更为灵活和可配置的方案。也许通过控制Url来控制访问权限也是一种可行的方案,会不会集成到RouteTable里面呢?让我们试目以待吧
,通过重写这个抽象类的这些虚方法,我们就可以实现对特定的执行过程进行拦截。

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

本文作者:



相关阅读:
jsp Hibernate入门教程
基于JQuery的简单实现折叠菜单代码
MySQL的Data_ADD函数与日期格式化函数说明
如何删除数据库中的冗余数据(2)
虚拟化应用不断演进
css教程:DIV垂直居中的办法
浅析JavaScript中的静态类及JSON
搭建企业分支机构虚拟网络之Windows Server 2003
巧用UCenter Home管理相册 还原纯净绿色SNS
10个实用的PHP代码片段
使网页成黑白色调的滤镜
随机显示个性签名的js代码(兼容ie,firefox)
XHTML1.0与HTML兼容指引16条 小结
mysql中的“money”类型说明
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 在新农村建设中发挥乡镇纪委的职能作用 2015曹冲称象教学反思 高斯作文1000字 我喜欢下面每一个故事,值得一辈子珍藏。 不该较劲别较劲 请你带我一起去作文200字 换了你,你会杀了谁 男友生日祝福语 与你“童”趣 姐妹,谢谢有你的陪伴、 描述心情的语句 旅游年终小结 侯以雷诗歌欣赏3137 经验胜过经历 “改进作风怎么办?”心得体会 看得见的伤口,迟早有一天会痊愈的 学会过属于自己的快乐生活 在森林中 小学生写人作文600字:穷人 2016年人口计划生育工作总结 小学二年级作文300字:小白龙 乡镇人大主席三严三实对照检查材料 上一分钟的感动 下一分钟的心痛 Give Me One More Chance 风作文150字 和往事牵手 又是春残花落时作文1200字 喧闹的断想 赴奉化市藤头村考察学习交流发言稿 给校长的一封建议书然作文450字 公司财务部岗位职责 物流公司员工辞职感谢信 值得品味的苏芩经典爱情语录 《生命》 片刻的时间给自己 人生就是一场豪赌 精选研究生复试英语自我介绍 2013年电力公司总会计师述职述廉报告 高中高三作文1000字:做一只不平凡的小老鼠 ——读皮皮鲁和舒克贝塔有感 入党申请书的写法及范文 小学四年级作文550字:四季之美 安全伴我行作文200字 经典情书节选 城区工程建设指挥部关于重点道路工程收尾工作的情况汇报 相拥鼓励,实现梦想 初三学生入团志愿书300字 奏起晨之心曲 美女过敏症 “三八”妇女节讲话 军训总结作文450字

Copyright © 2016 phpStudy |