Подтвердить что ты не робот

Лучший способ прервать/отменить действие и ответ от 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() `здесь, но я не уверен, что это лучший способ сбросить ответ и закрыть соединение.

4b9b3361

Ответ 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 я открыт для предложений