Почему AuthenticationManager.SignOut() не работает при изменении ответа?

Я только начал играть с OWIN/Katana и MVC.NET 5.0. Шаблон веб-приложения ASP.NET по умолчанию для Visual Studio 2013 для веб-приложений/MVC имеет AccountController с действием LogOut():

public ActionResult LogOff() {
    AuthenticationManager.SignOut();
    return RedirectToAction("Index", "Home");
}

Как и ожидалось, это работает отлично. Однако, когда я изменяю код состояния ответа, например. по:

    Response.SetStatus(HttpStatusCode.SeeOther);

... Метод AuthenticationManager.SignOut() больше не приводит к тому, что пользователь выходит из системы. Почему это?

Я пробовал разные подходы для установки кода статуса HTTP для ответа, а также для изменения заголовков HTTP, таких как Location, и всегда с тем же результатом - пользователь не выходил из системы при выполнении действия LogOff(), если я получить в отпуск с ответом.

Я попробовал не использовать RedirectToAction (который явно реализует перенаправление 302 - это еще одна история), а не возвращать ActionResult, но это не имело никакого значения - не то, что я действительно ожидал бы этого.

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

Я также пробовал просматривать исходный код промежуточного программного обеспечения OWIN на работе, но архитектура до сих пор не знакома мне, и я не нашел ответов, которые я мог бы понять там. Мне нужна твоя помощь в сортировке, так что спасибо заранее!

Ответ 1

Причина AuthenticationManager.SignOut() не соответствует тому, что Response.SetStatus(HttpStatusCode.SeeOther) внутренне завершает ответ:

public static void SetStatus(this HttpResponseBase response, int httpStatusCode)
{
  response.StatusCode = httpStatusCode;
  response.End();
}

(см. System.Web.WebPages.ResponseExtensions)

После этого, естественно, ResponseManager не может манипулировать ответом для удаления файлов cookie и т.д.

Ответ 2

Это отлично подходит для меня со следующим методом LogOut: вы делаете что-то немного по-другому?

    //
    // POST: /Account/LogOff
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult LogOff()
    {
        Response.StatusCode = 303;
        AuthenticationManager.SignOut();
        return RedirectToAction("Index", "Home");
    }