行,就可以对标记的Action实现调用之前的过滤了,所以我们首先实现一个AuthorizeAttributeBase,例如:
// Release : code03, 2009/04/22
// Author : Anytao, http://www.anytao.com
public abstract class AuthorizeAttributeBase : ActionFilterAttribute
{
public AuthorizeAttributeBase()
{
}
public AuthorizeAttributeBase(string key)
{
Key = key;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// Authorize handler
}
public string Key { get; set; }
protected abstract bool IsAuthorized(int id);
}
而具体的验证则在具体实现类中,例如我们对Book的验证:
// Release : code04, 2009/04/22
// Author : Anytao, http://www.anytao.com
public class BookAuthorizeAttribute : AuthorizeAttributeBase
{
protected override bool IsAuthorized(int id)
{
return (new IAuthorizeService()).IsBookAuthorized(id);
}
}
对于验证的处理必须解决两方面的问题:
在AuthorizeAttributeBase中获取待过滤Action中的参数(Index(int id)),一般而言我们需要对id进行验证,那么传入id的值该如何处理。
在AuthorizeAttributeBase对于非法用户的处理,一般而言就是导航到NotValid页面。
在OnActionExecuting中获取Action参数
我们采用的方法是通过filterContext的ActionParameters来获取参数值,通过参数的Key来获取其值,例如:
if (filterContext.ActionParameters.ContainsKey(key))
{
value = int.Parse(filterContext.ActionParameters[key].ToString());
}
在OnActionExecuting中导航到不同的View
这也是一个简单的处理,我们只要指定好filterContext的Result为指定的ViewResult即可实现我们的目标:
filterContext.Result = new ViewResult{
ViewName = "NotValid"
};
解决了上述问题,就基本实现了对Authorize进行统一处理的目标,至于具体的Authorize逻辑,不同的业务可以在不同的业务层进行封装。例如对于Book资源的处理可以统一在IBookService中,对于User资源的处理可以统一在IUserService中(不过显然我们已经有了MVC自带的Authorize,不必重复),对于其他的资源也相应的处理在不同的业务层中。
下面是AuthorizeAttributeBase和BookAuthorizeAttribute的完整代码:
// Release : code03, 2009/04/22
// Author : Anytao, http://www.anytao.com
public abstract class AuthorizeAttributeBase : ActionFilterAttribute
{
public AuthorizeAttributeBase()
{
}
public AuthorizeAttributeBase(string key)
{
Key = key;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
string key = string.IsNullOrEmpty(Key) ? "id" : Key;
int id;
if (filterContext.ActionParameters.ContainsKey(key))
{
if (!int.TryParse(filterContext.ActionParameters[key].ToString(), out id))
{
id = 0;
}
}
else
{
id = 0;
}
if (id > 0)
{
if (IsAuthorized(id))
{
base.OnActionExecuting(filterContext);
}
else
{
|