12

我刚开始摆弄 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 状态代码,以及更改诸如 Location 之类的 http 标头,并且始终得到相同的结果 - 如果我进入缓和状态,执行 LogOff() 操作时用户不会注销与回应。

我尝试不使用 RedirectToAction(它显式地实现了 302 重定向——那是另一回事),也没有返回 ActionResult,但这并没有什么不同——并不是我真的期望它这样做。

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

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

4

2 回答 2

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 等。

于 2013-12-17T07:52:55.737 回答
2

使用以下 LogOut 方法对我来说效果很好,您做的事情是否略有不同?

    //
    // POST: /Account/LogOff
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult LogOff()
    {
        Response.StatusCode = 303;
        AuthenticationManager.SignOut();
        return RedirectToAction("Index", "Home");
    }
于 2013-12-16T18:31:40.430 回答