2011-10-05 94 views
2

在ASP.NET MVC3控制器操作中,我想注销用户并返回401状态码。代码很简单:FormsAuthentication.SignOut在设置响应状态代码时失败

public ActionResult Index() 
{ 
FormsAuthentication.SignOut(); 
HttpContext.Response.StatusCode = 401; 
return null; 
} 

当我设置状态代码时,用户没有注销。为什么?如果我删除状态代码行,用户将注销,但我不想返回200状态。

这是怎么回事?我如何达到理想的行为?

这是我结束了解决问题:

if (Request.IsAjaxRequest()) 
{ 
    FormsAuthentication.SignOut(); 
    Response.StatusCode = 401; 
    Response.Flush(); 
    return null; 
} 
else 
{ 
    FormsAuthentication.SignOut(); 
    return new HttpUnauthorizedResult(); 
} 

回答

1
public ActionResult Index() 
{ 
    FormsAuthentication.SignOut(); 
    return new HttpUnauthorizedResult(); 
} 
+0

这适用于非AJAX请求,但对于AJAX请求无法正常工作。在原始帖子中查看我的解决方案。 – Mark

1

当您设置状态码401(未授权),浏览器没有继续保存您以前的设置与饼干SignOut()调用。

要完全签名,您必须明白您需要在浏览器中写下Cookie(实际上是使用SignOut清除Cookie)。

也许一个想法是重定向到一个新页面,并在这个新页面中返回401的状态码。实际上,您可以使用中间页面来制作SignOut和其他SignOut操作,然后重定向到给消息的最后一页。

您也可以尝试在StatusCode之前调用Response.Flush();,强制浏览器记下SignOut()的Cookie。

+0

你让我在Response.Flush()的正确轨道上,但Response.Flush必须在状态码设置后调用。在原始文章中查看我的完整解决方案。 – Mark