7

在我的 filterConfig 中,我注册了一个全局属性过滤器,它需要对我的每个方法进行授权。

但是,我有一种特殊的方法,我想应用不同的授权过滤器属性。如果可能的话,如何做到这一点?

注意:我不想使用 [AllowAnonymous] 属性(它无缝地工作并且完全忽略我的过滤器),因为我希望通过方法上的一组不同的授权逻辑来授权请求​​。

4

2 回答 2

6

AllowMultiple = true您可以通过在属性类上设置属性来更改过滤器以允许多个过滤器AttributeUsage,并添加一个检查,以便如果过滤器多次出现,则不会执行全局应用的过滤器。ActionExecutingContext传入的OnActionExecuting()允许您通过 应用过滤器filterContext.ActionDescriptor.GetCustomAttributes(),因此您可以在此处使用它。

然后,更改构造函数,以便您可以传入一个参数(可能是一个枚举),它可以用来决定使用哪种授权方法 - 普通方法或其他方法。给该参数一个默认值,使其选择正常的身份验证方法。然后,在需要不同身份验证方法的那个方法上,您可以将过滤器与参数的其他值一起应用。所以它可能看起来像这样:

public class CustomAuthAttribute : AuthorizeAttribute
{
    public CustomAuthAttribute(AuthMethod method = AuthMethod.StandardAuth)
    {
        //stuff
    }
}

[CustomAuth(AuthMethod.WeirdAuth)]
public ActionResult MethodThatNeedsDifferentAuth()
{
    //stuff
}
于 2013-03-27T17:13:22.280 回答
3

您可以编写自己的授权属性版本并将特定参数传递给具体取决于您希望属性执行的操作,例如

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
于 2013-03-27T16:59:38.680 回答