MVC覆盖AllowAnonymous属性

时间:2015-08-11 19:26:16

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

有没有办法覆盖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);
        }
    }
}

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

1 个答案:

答案 0 :(得分:6)

  

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

因此,当我们使用AllowAnonymous属性修饰操作方法时,onAuthorization的{​​{1}}方法只会忽略授权和身份验证检查。所以在我的情况下,我还必须创建一个属性(一个继承自属性类的空白密封类)并稍微修改AuthorizeAttribute方法。

以下是完整的实施:

OnAuthorization

然后覆盖授权属性的public sealed class AuthenticateAttribute : Attribute { public AuthenticateAttribute() { } } 方法(当然我假设您已经实现了自定义授权过滤器)。

onAuthorization

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

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);
    }
}