我刚开始摆弄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中间件的源代码,但我仍然不熟悉该架构,我找不到我能掌握的答案。我需要你的帮助来解决这个问题,所以提前谢谢你!
答案 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");
}