在MVC中为一个方法重写一个全局过滤器
本文关键字:一个 重写 全局 过滤器 方法 MVC | 更新日期: 2023-09-27 18:06:22
在我的filterConfig中,我注册了一个全局属性过滤器,它需要对我的每个方法进行授权。
但是,我有一个特殊的方法,我想在其中应用不同的授权筛选器属性。如果可能的话,一个人如何做到这一点呢?
注意:我不想使用[AllowAnonymous]属性(它可以无缝地工作并且完全忽略我的过滤器),因为我希望请求被授权,只是通过方法上的一组不同的授权逻辑。
您可以通过在属性类的AttributeUsage
属性中设置AllowMultiple = true
来更改过滤器以允许多个过滤器,并添加一个检查,以便如果过滤器出现多次,则全局应用的过滤器不会执行。传递到OnActionExecuting()
的ActionExecutingContext
让您通过filterContext.ActionDescriptor.GetCustomAttributes()
获得应用的过滤器,因此您可以在这里使用它。
然后,修改构造函数,以便您可以传入一个参数(可能是一个enum),它可以使用该参数来决定使用哪种授权方法-普通方法还是另一种方法。为该参数指定一个默认值,使其选择正常的auth方法。然后,在需要不同验证方法的那个方法上,您可以使用该参数的其他值应用过滤器。所以它可能看起来像这样:
public class CustomAuthAttribute : AuthorizeAttribute
{
public CustomAuthAttribute(AuthMethod method = AuthMethod.StandardAuth)
{
//stuff
}
}
[CustomAuth(AuthMethod.WeirdAuth)]
public ActionResult MethodThatNeedsDifferentAuth()
{
//stuff
}
您可以编写自己版本的authorize属性,并根据您希望属性执行的操作传递特定的参数,例如
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
public string currentAction { get; set; }
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (currentAction != "notallowed")
{
HandleUnauthorizedRequest(filterContext);
}
}
}
protected override void HandleUnauthorizedRequest(AuthorizationContext context)
{
context.Result = new RedirectResult("/home/login");
}
,然后应用到你的类或动作
[CustomAuthorize(currentAction = "notallowed")]
public class HomeController : Controller