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抽象类,通过重写这个 抽象类的这些虚方法,我们就可以实现对特定的执行过程进行拦截。

另一种方法,我们注意到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);
}
}
}
/// <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里面呢?让我们试目以待吧。

时间: 2024-09-17 04:17:25

ASP.NET MVC :MVC页面验证与授权的相关文章

asp.net里面的身份验证和授权

今天闲着无聊.想起来了ASP.NET身份验证.感觉良好.贴出下列代码:login.aspx HTML代码 <%@ Page language="c#" Codebehind="02Login.aspx.cs" AutoEventWireup="false" Inherits="身份验证._02Login" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 T

ASP.NET MVC的客户端验证:jQuery的验证

之前我们一直讨论的Model验证仅限于服务端验证,即在Web服务器根据相应的规则对请求数据实施验证.如果我们能够在客户端(浏览器)对用户输入的数据先进行验证,这样会减少针对服务器请求的频率,从而缓解Web服务器访问的压力.ASP.MVC 2.0及其之前的版本采用ASP.NET Ajax进行客户端验证,在ASP.NET MVC 3.0中,jQuery验证框架被引入是我们可以采用Unobtrusive JavaScript的方式进行客户端验证. 一.Unobtrusive JavaScript Un

利用EntLib授权机制实现对ASP.NET页面的自动授权

ASP.NET默认采用UrlAuthorizationModule和FileAuthorizationModule分别实现针对请求地址和物理文件的授权,但是在很多情况下我们需要额外的授权方式.Entlib提供了一种基于表达式的授权方式,它允许我们以一个表达式的方式来定义授权的规则.在新的项目中我们希望利用EntLib的授权框架来实现针对ASP.NET页面的自动授权,本文描述的解决方案是我刚刚想到的,希望广大网友朋友们帮助评估一下.[源代码从这里下载] 目录 一.实例演示 二.Authorizat

Asp.net中基于Forms验证的角色验证授权

asp.net Asp.net中基于Forms验证的角色验证授权 Asp.net的身份验证有有三种,分别是"Windows | Forms | Passport",其中又以Forms验证用的最多,也最灵活.Forms 验证方式对基于用户的验证授权提供了很好的支持,可以通过一个登录页面验证用户的身份,将此用户的身份发回到客户端的Cookie,之后此用户再访问这个web应用就会连同这个身份Cookie一起发送到服务端.服务端上的授权设置就可以根据不同目录对不同用户的访问授权进行控制了. 问

使用shieldUI Chart控件在ASP.NET和MVC应用程序中创建一个销售仪表板

本文中,我们将处理一个常见的数据可视化任务,即创建一个销售仪表板 (dashboard).在商业演示中经常会使用销售仪表板来展现某个商业流程或商业 目标的关键绩效指标,而完成这样一个演示的关键不仅在于对数据进行良好的可 视化展示,还要有赏心悦目的外观.为了完成这一任务,我会使用相关的图表组 件,它提供了全部的所需功能.这个示例中将使用ShieldUI中的图表组件,这一 系列产品可以从网站的免费下载. 完成后的展示请见下图: 本示例将使用ASP.NET与MVC两种方式讲解. 使用代码 ASP.NE

asp.net中mvc使用ajax提交参数的匹配问题解决探讨

本文为大家介绍下使用javaScript解决asp.net中mvc使用ajax提交参数的匹配问题,遇到类似情况的朋友可以参考下,希望对大家有所帮助   想到在asp.net的mvc中如果使用ajax向服务端传递参数时如果参数是一个类或者是个数组(或List集合)以及更复杂的对象时,服务端总是会发 生取不到值的情况,当然网上也有很多解决的例子,但都是在服务端想办法来解决的(比如将json转换为字符串,再在服务端反序列化为一个对象),为何不能 在客户端就把这个问题搞定. 其实问题没那么复杂,那是因为

asp.net的MVC怎么伪静态在*.html或者*.htm

问题描述 asp.net的MVC(http://www.xx.com/home/index)怎么伪静态成*.html或者*.htm,用了下面的方法好像不行,有知道的人稍微发一个完整的解决方案,谢谢routes.MapRoute("Default","{controller}/{action}/{page}",new{controller="Home",action="Index",page="index.htm&qu

asp.net的MVC编程、MV编程以及URL重写

 前一段时间做一个网站项目,使用win2003+.net2.0开发:在学习了一些.net的相关知识后,并考虑到此项目需要多人合作,以及架构清晰.URL重写等优点,决定用MVC方式开发.但微软的.net MVC框架据说要下半年才出正式版,而且还需要.net3.5,其他的MVC框架又不熟悉,估计也需要一段时间学习.由于开发时间比较紧,我们开发小组中也没有一个对.net及.net MVC框架非常熟悉的人,所以又想转回使用传统的.net编程方式开发. 在两难之际,我想也许可以在项目需求出来前,自己试着写

C# web 开发 MVC 模型数据验证 必填项

问题描述 C# web 开发 MVC 模型数据验证 必填项 问题是: 在开发网站的时候.有一个页面是增加产品和编辑产品共用. 为了在编辑的时候.方便ID的获取.在页面上添加隐藏的绑定模型的控件. 在后台数据验证端.该字段并没有设置必填.而前台页面却提示必填.导致没法进行. input class="input-validation-error" data-val="true" data-val-number="字段 PlaProductId 必须是一个数字