Лучший способ прервать/отменить действие и ответ от ActionFilter
Лучший способ прервать/отменить действие из ActionFilter
У меня есть этот ActionFilter
, и он должен немедленно прекратить соединение и вернуть 401 Unauthroized:
public class SignInRequired : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// User is verified, continue executing action
if (Acme.Web.CurrentUser != null)
{
return;
}
// End response with 401 Unauthorized
var response = HttpContext.Current.Response;
response.StatusCode = (int)HttpStatusCode.Unauthorized;
response.End();
// Prevent the action from actually being executed
filterContext.Result = new EmptyResult();
}
}
Я узнал, как вы можете отменить действие от выполнения, установив здесь 'context.Result = new EmptyResult() `здесь, но я не уверен, что это лучший способ сбросить ответ и закрыть соединение.
Ответы
Ответ 1
Настройка ответа будет означать, что действие не вызвано.
public override void OnActionExecuting(HttpActionContext actionContext)
{
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
}
Как утверждают другие ответы, аутентификация должна выполняться с помощью AuthorizeAttribute (Docs для Web.API или для MVC).
Ответ 2
Вероятно, вы хотите сделать это AuthorizeAttribute. Это автоматически установит результат UnAuthorizedResult, плюс он будет полезен для запуска перед любыми другими фильтрами. В качестве альтернативы вы можете установить для Result новый HttpUnauthorizedResult
public class SignInRequiredAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
return !Acme.Web.CurrentUser != null;
}
}
Ответ 3
Ответ, что @OdeyinkaOlubunmi верен для веб-API или специально System.Web.Http.Filters.ActionFilterAttribute
, но он не может использоваться для System.Web.Mvc.ActionFilterAttribute
. AuthorizeAttribute
и переопределение AuthorizeCore
- хороший способ, но если вы используете пример @Vadim для GlobalFilter, вы получите следующую ошибку в стандартной конфигурации:
Ошибка HTTP 404.15 - не найден Модуль фильтрации запросов настроен на отказ от запроса, где строка запроса слишком длинная.
Это связано с тем, что по умолчанию /Login?ReturnUrl=
будет продолжать добавлять новые значения до тех пор, пока строка запроса не приведет к исключению.
Способ, которым я решил это для MVC, выглядит следующим образом:
public class DebugActionFilter : System.Web.Mvc.ActionFilterAttribute
{
public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext actionContext)
{
actionContext.Result = new HttpStatusCodeResult(HttpStatusCode.Unauthorized);
return;
}
}
Ответ 4
Вы можете установить результат filterContext для страницы Exception следующим образом:
filterContext.Result = new RedirectResult("~/Error/Unauthorized");
Подробнее здесь в разделе Отмена выполнения фильтра
Ответ 5
с помощью .net core 2.1 вышеуказанные решения у меня не сработали, поэтому я попробовал это, и это сработало:
context.HttpContext.Response.StatusCode = 401;
return;
если есть лучшие решения для .net core 2.1 я открыт для предложений