我有一个似乎在表面上工作的自定义AuthorizationAttribute。当没有正确权限的用户通过浏览器请求操作时,会显示相应的消息。
我开始将此属性应用于执行删除操作的HttpPost
操作。即使响应正确,操作的主体仍会执行(在这种情况下,项目将被删除)。
如果授权属性失败,我希望能够完全阻止action方法执行任何操作。这是AuthorizationAttributes的用途,还是应该以另一种方式查看?
更新
public override void OnAuthorization(AuthorizationContext filterContext)
{
Check.Require(filterContext != null);
if (service.HasPermission(requiredPermission))
return;
filterContext.HttpContext.Response.StatusCode = 404;
filterContext.HttpContext.Response.StatusDescription = "File not found";
}
控制器动作正如这样进行装饰:
[HttpPost, RequiresPermission(Permissions.CanDeleteContentItem)]
public JsonResult Delete(Guid id)
答案 0 :(得分:6)
查看my answer here,因为它与您要完成的内容类似。
您需要做的是更改操作返回的结果,而不是仅更改标头值。
public override void OnAuthorization(AuthorizationContext filterContext)
{
Check.Require(filterContext != null);
if (service.HasPermission(requiredPermission))
return;
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", "Home" }, {"action", "NoPermission" } })
}
如果您想要返回正确的HTTP响应,也可以执行以下操作:
filterContext.Result = new HttpUnauthorizedResult();