快速业务通道

[一步一步MVC]第二回:还是ActionFilter,实现对业务逻辑的统一Authorize处理

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-21
行,就可以对标记的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
      {
    

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号