授权属性是否可以阻止操作完全执行?

时间:2011-01-02 04:54:00

标签: c# asp.net-mvc attributes authorization

我有一个似乎在表面上工作的自定义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)

1 个答案:

答案 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();