为什么在更改响应时AuthenticationManager.SignOut()失败?

Osk*_*erg 12 asp.net-mvc owin katana asp.net-mvc-5

我刚开始摆弄OWIN/Katana和MVC.NET 5.0.默认的Visual Studio 2013 ASP.NET Web应用程序/ MVC模板具有一个带有LogOut()操作的AccountController:

public ActionResult LogOff() {
    AuthenticationManager.SignOut();
    return RedirectToAction("Index", "Home");
}
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,这很好用.但是,当我更改响应状态代码时,例如:

    Response.SetStatus(HttpStatusCode.SeeOther);
Run Code Online (Sandbox Code Playgroud)

... AuthenticationManager.SignOut()方法不再导致用户注销.这是为什么?

我尝试了不同的方法来设置响应的http状态代码,以及更改像"位置"这样的http标头,并且始终具有相同的结果 - 当执行LogOff()操作时,如果我进入回火状态,则用户不会注销随着回应.

我尝试不使用RedirectToAction(它显式实现302重定向 - 这是另一个故事),而不是返回ActionResult,但这没有任何区别 - 不是我真的希望它.

使用Fiddler我可以看出浏览器看起来的响应看起来很好,没有任何意外.

我也尝试在工作中查看OWIN中间件的源代码,但我仍然不熟悉该架构,我找不到我能掌握的答案.我需要你的帮助来解决这个问题,所以提前谢谢你!

Osk*_*erg 7

AuthenticationManager.SignOut()失败的原因是Response.SetStatus(HttpStatusCode.SeeOther)内部结束了响应:

public static void SetStatus(this HttpResponseBase response, int httpStatusCode)
{
  response.StatusCode = httpStatusCode;
  response.End();
}
Run Code Online (Sandbox Code Playgroud)

(见System.Web.WebPages.ResponseExtensions)

在此之后,自然ResponseManager无法操纵响应以删除cookie等.