«невозможно установить статус после заголовков HTTP» при переопределении AuthorizeAttribute.AuthorizeCore - PullRequest
3 голосов
/ 13 октября 2011

Я пытаюсь реализовать пользовательскую базовую аутентификацию на конкретном контроллере приложения MVC 2. В частности, я унаследовал от AuthorizeAttribute и переопределить AuthorizeCore() метод:

protected override bool AuthorizeCore(HttpContextBase httpContext)
{
    if( doAuthorization() ) {
        return true;
    }
    // send HTTP 401
    HttpContext context = HttpContext.Current;
    context.Response.StatusCode = 401;
    context.Response.AddHeader( "WWW-Authenticate",
        String.Format("Basic realm=\"{0}\"", myRealm);
    context.Response.End();
    return false;
}

и пометил контроллер моим унаследованным атрибутом.

Все работает, но всякий раз, когда AuthorizeCore возвращает false MVC продолжает обрабатывать запрос, и вызывается Application_Error(), и я получаю там следующее исключение:

Server cannot set status after HTTP headers have been sent.
at System.Web.HttpResponse.set_StatusCode(Int32 value)
at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName)
at System.Web.Mvc.Controller.ExecuteCore()
at System.Web.Mvc.MvcHandler.<>c__DisplayClass8.<BeginProcessRequest>b__4()
at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass1.<MakeVoidDelegate>b__0()
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

Как заставить MVC прекратить обработку запроса и предотвратить это исключение?

Ответы [ 2 ]

6 голосов
/ 23 октября 2013

Я столкнулся с подобной проблемой (где мне нужно перенаправить) и ниже исправлена ​​моя

  1. Я использовал переопределение OnAuthorization
  2. Когда я должен был перенаправить сделалниже

    filterContext.Result = new HttpStatusCodeResult (System.Net.HttpStatusCode.Redirect);filterContext.HttpContext.Response.Redirect (url, false);

Ключ должен был заполнить filterContext.Result.Если заполненный фреймворк MVC не вызывал метод действия.

0 голосов
/ 13 октября 2011

Пожалуйста, смотрите ответ здесь: Расширьте AuthorizeAttribute Override AuthorizeCore или OnAuthorization

Вы не должны устанавливать заголовки и заканчивать ответ в AuthorizeCore как его «код решения»

Переопределить OnAuthorization для добавления заголовков и т. Д.

РЕДАКТИРОВАТЬ: чтобы предотвратить продолжение обработки запроса MVC, необходимо установить FilterContext.Result в OnAuthorization.

РЕДАКТИРОВАТЬ: в конечном итоге вы можете получить CustomError.Если это так, добавьте следующее:

HttpContext.Response.TrySkipIisCustomErrors(true)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...