Может ли AuthorizationAttribute предотвратить полное выполнение действия? - PullRequest
9 голосов
/ 02 января 2011

У меня есть собственный атрибут AuthorizationAttribute, который, кажется, работает на поверхности.Когда пользователь без правильных разрешений запрашивает действие через браузер, ему показывается соответствующее сообщение.

Я начал применять этот атрибут к HttpPost действиям, которые выполняют такие действия, как удаление.Даже если ответ правильный, тело действия по-прежнему выполняется (в этом случае элемент удаляется).

Я хочу иметь возможность полностью запретить методу действия что-либо делать при авторизацииатрибут не выполняется.Это то, для чего используются 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 Ответ

6 голосов
/ 02 января 2011

Проверьте мой ответ здесь , так как он похож на то, что вы пытаетесь достичь.

Вам нужно изменить результат, возвращаемый действием, а не просто изменить значения заголовка.

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();
...