在我的filterConfig中,我注册了一个全局属性过滤器,需要对我的每个方法进行授权。
但是,我有一个特殊的方法,我想应用不同的授权过滤器属性。如果可能的话,如何实现这一目标?
注意:我不想使用[AllowAnonymous]属性(它无缝地工作并完全忽略我的过滤器),因为我希望通过该方法上的一组不同的授权逻辑来授权请求。
答案 0 :(得分:5)
您可以通过在属性类的AllowMultiple = true
属性中设置AttributeUsage
来更改过滤器以允许多次过滤,并添加一项检查,以便在过滤器多次出现时使用全局应用的过滤器不执行。传递到ActionExecutingContext
的{{1}}可让您通过OnActionExecuting()
获取过滤器,因此您可以在此处使用。
然后,更改构造函数,以便您可以传入一个参数(可能是枚举),它可以用来决定使用哪种授权方法 - 正常的方法,或另一种授权方法。为该参数赋予一个默认值,使其选择正常的auth方法。然后,在那个需要不同auth方法的方法上,您可以将过滤器与参数的其他值一起应用。所以它可能看起来像这样:
filterContext.ActionDescriptor.GetCustomAttributes()
答案 1 :(得分:3)
您可以编写自己的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