【问题标题】:MVC override AllowAnonymous attributeMVC 覆盖 AllowAnonymous 属性
【发布时间】:2015-11-04 04:20:51
【问题描述】:

有没有办法覆盖AllowAnonymous 属性?我已经实现了从数据库加载用户菜单和按钮的自定义授权,如下所示:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new MyCustomAuthorization()); // Custom Authorization for Rights & Priveleges
}

以上工作正常。

现在,如果用户通过身份验证,我想允许访问某些操作,在这种情况下无需检查授权。示例:

[Authorize]
public class MenusAndButtonsController : BaseController
{
    [Authenticated] // my custom attribute that will check if user is logged in or not
    public JsonResult GetGeneralMenuAndButtons()
    {
        using (MealPlannerAuthorizationEntities repository = new MealPlannerAuthorizationEntities())
        {
            var MenusAndButtons = repository.MP_AUTH_Menus.Where(x => x.IsButton == false && x.IsListButton == false).Select(c => new { DisplayText = c.MenuName, Value = c.MenuId }).OrderBy(x => x.DisplayText).ToList();
            return Json(new { Result = "OK", Options = MenusAndButtons }, JsonRequestBehavior.AllowGet);
        }
    }
}

我正在尝试创建自己的自定义属性[Authenticated] 而不是AllowAnonymous,它将检查用户是否已登录。如果用户已登录,它将返回 true,GetGeneralMenuAndButtons 将继续其操作。

【问题讨论】:

    标签: asp.net-mvc-4 authentication custom-attributes filterattribute


    【解决方案1】:

    其实AllowAnonymous类是简单的空密封属性类。

    所以当我们用AllowAnonymous 属性装饰一个action 方法时,AuthorizeAttributeonAuthorization 方法简单地忽略了授权和身份验证检查。所以就我而言,我还必须创建一个属性(继承自属性类的空白密封类)并稍微修改OnAuthorization 方法。

    下面是完整的实现:

    public sealed class AuthenticateAttribute : Attribute
    {
        public AuthenticateAttribute() { }
    }
    

    然后覆盖 Authorize 属性的onAuthorization 方法(当然我假设你已经实现了自定义授权过滤器)。

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        bool IsAuthenticAttribute =
            (filterContext.ActionDescriptor.IsDefined(typeof(AuthenticateAttribute), true) ||
            filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AuthenticateAttribute), true)) &&
            filterContext.HttpContext.User.Identity.IsAuthenticated;
    
        if (!IsAuthenticAttribute)
        {
            base.OnAuthorization(filterContext);
        }
    }
    

    最后用我们新的 Authenticate 属性装饰你的动作方法:

    [Authenticate]
    public JsonResult GetParentMenus()
    {
        using (MealPlannerAuthorizationEntities repository = new MealPlannerAuthorizationEntities())
        {
            var parentMenus = repository.MP_AUTH_Menus.Where(x => x.IsButton == false && x.IsListButton == false).Select(c => new { DisplayText = c.MenuName, Value = c.MenuId }).OrderBy(x => x.DisplayText).ToList();
            return Json(new { Result = "OK", Options = parentMenus }, JsonRequestBehavior.AllowGet);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-19
      相关资源
      最近更新 更多