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

时间:2013-12-13 10:03:31

标签: asp.net-mvc asp.net-mvc-5 owin katana

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

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

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

    Response.SetStatus(HttpStatusCode.SeeOther);

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

我尝试了不同的方法来设置响应的http状态代码,以及更改像“位置”这样的http标头,并始终使用相同的结果 - 执行LogOff()操作时用户不会注销,如果我通过回应进行磨练。

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

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

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

2 个答案:

答案 0 :(得分:7)

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等的响应。

答案 1 :(得分:2)

使用以下LogOut方法对我来说这很好用,你做的事情有点不同吗?

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