2013-12-13 24 views
12

我刚开始摆弄OWIN/Katana和MVC.NET 5.0。默认的Visual Studio 2013 ASP.NET Web应用程序/ MVC模板具有的AccountController与退出()动作:为什么AuthenticationManager.SignOut()在更改响应时失败?

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

正如预期的那样,这工作得很好。但是,当我改变响应状态码时,例如通过:

Response.SetStatus(HttpStatusCode.SeeOther); 

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

我尝试了不同的方法来设置响应的http状态码,以及像位置一样更改http头,并始终使用相同的结果 - 执行LogOff()操作时用户未注销,如果我对这个反应进行了调整。我试过没有使用RedirectToAction(它显式地实现了302重定向 - 这是另一个故事),并没有返回ActionResult,但这没有什么区别 - 这并不是我真正期望的。

使用Fiddler我可以告诉响应,因为它看起来对浏览器看起来很好,没有任何意外。

我也试过在工作中浏览OWIN中间件的源代码,但这个架构对我来说还是不熟悉,而且我没有找到可以在那里理解的答案。我需要你的帮助来整理这个,所以提前谢谢你!

+0

当响应回到客户端的提琴手时,你看到Set-Cookie删除旧的c ookie? –

+0

不,我同意这是用户仍然被视为已登录的技术原因。我没有得到的是,为什么对SignOut()的调用不应该给出相同的结果,无论我是否更改状态码,删除cookie和全部。我可以自己删除cookie,或者如果我想要一个不同的行为,我甚至可以实现我自己的OWIN中间件,但我不知道。我只想要另一个状态代码,这可能与RedirectToAction实现的行为相矛盾,但为什么AuthenticationManager需要关心?我是否都在后面呢? –

+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不能操纵的响应,以除去饼干等

2

这适用于我以下的LogOut方法,你做的事情略有不同吗?

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

谢谢你的回复,郝。两件事:首先,上面的代码不会改变响应的状态代码(本身有点令人讨厌)。它实际上仍然是一个302响应,返回(参见Fiddler);其次,是的,正如你从我的示例代码中看到的那样,我做了Response.SetStatus(HttpStatusCode.SeeOther); –

+0

你的代码不工作的原因是RedirectToAction()将状态码再次改变为302.我回去检查Response.SetStatus()做什么来防止这种情况发生,并且它实际上执行了一个Response.End() 。如果您在代码中执行相同的操作,则会得到完全相同的结果 - 用户未注销。现在原因已经变得清晰了 - 当然,AuthenticationManager在响应“结束”之后无法执行注销,删除cookie和内容,对吧? :)这实际上是我的问题的答案,我猜...我不相信我忽略了这个... –

+0

记住你的密码后试试这个..它无法正常工作(请参阅我的答案)解决此问题 – Jimmyt1988

相关问题