我刚刚开始在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中间件的源代码工作,但架构对我来说还是不熟悉的,我发现没有可以把握的答案.我需要你的帮助排序,所以谢谢你提前!
解决方法
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自然无法操纵响应以删除cookies等