使用 asp.net mvc的Filter来验证Forms(判断是否登录,角色权限以及错误处理)

使用 asp.net mvc的Filter来验证Forms(判断是否登录,角色权限以及错误处理)

asp.net mvc里的Filter真的是个很好的东西.
之前看教程每次看到讲解Filter的地方总有模糊.
今天在做测试项目的时候.管理员后台管理的时候.我在每个Action里都先验证了一下是否登录.
结果做了7,8个Action的时候发现这样是不是有点太累了?脑袋里马上灵光一闪.Filter不是有个内置验证身份的吗?
马上搜索,一翻查找之后才发现内置的这个身份验证是争对membership的.而我使用的Forms验证..
咋办..继续搜呗.功夫不负有心人..终于让我给找到了.经过测试,使用很不错.
7,8个action里的if (!Request.IsAuthenticated)终于可以变成一句了..这样我就可以更安心的写Action了.
不说了.贴代码.
先是自定义的 Filter:

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;
using System.Web.Routing;

namespace cml.web.Filters
{
///


/// 角色认证
///

public class VaildateLoginRoleAttribute : ActionFilterAttribute
{
///
/// 角色名称
///

public string Role { get; set; }

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!string.IsNullOrEmpty(Role))
{
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
string redirectOnSuccess = filterContext.HttpContext.Request.RawUrl;
string redirectUrl = string.Format("?ReturnUrl={0}", redirectOnSuccess);
string loginUrl = FormsAuthentication.LoginUrl + redirectUrl;
filterContext.HttpContext.Response.Redirect(loginUrl, true);
}
else
{
//判断是否存在角色
FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;
FormsAuthenticationTicket ticket = id.Ticket;
string roles = ticket.UserData;
string[] chkRoles = this.Role.Split(',');
bool isAuthorized = false;
if (Array.IndexOf(chkRoles, roles) > -1)
isAuthorized = true;
else
isAuthorized = false;

if (!isAuthorized)
filterContext.Result = new RedirectToRouteResult("Default", new RouteValueDictionary(new { controller = "Manage", action = "AdminLogin" }));
//throw new UnauthorizedAccessException("你没有权限访问该页面");
}
}
else
{
throw new InvalidOperationException("没有指定角色");
}
}
}

//错误验证
//public class ErrorAttribute : ActionFilterAttribute
//{
// public override void OnActionExecuted(ActionExecutedContext filterContext) // OnActionExecuted表示在Action执行之后
// {
// if (filterContext.Exception != null)
// {
// filterContext.ExceptionHandled = true;
// filterContext.Result = new RedirectToRouteResult("Default", new RouteValueDictionary(new { controller = "Shared", action = "Error" }));
// }
// }
//}
public class VaildateLogin : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
filterContext.Result = new RedirectToRouteResult("Default", new RouteValueDictionary(new { controller = "Manage", action = "AdminLogin" }));
}
}
}
}

FilterOK了..就去Controller里使用吧.

[VaildateLogin] //这里就是使用的Filter验证,记得在using里引用Filter的命名空间.
public ActionResult AddAdmin()
{
//if (!Request.IsAuthenticated) //这里是开始手动写的..多麻烦...
//{
// return RedirectToAction("AdminLogin");
//}
//else
//{
cml.BLL.Admin bll = new cml.BLL.Admin();
ViewData["list_model"] = bll.GetAdminList("", 1);
return View();
//}
}

怎么样.很方便吧.如果是整个Controller下都需要身份验证的话..那就把这个Filter放到最外层的Controller上..这样就不用在每个Action上都写了.

完工..希望多点人来学习asp.net mvc..要不然教程太少了.好东西也太少了.

from http://www.9aw.cn/post/2009/07/06/asp-net-mvc-Filter-Forms.aspx