【问题标题】:FormsAuthentication.SignOut Fails When Setting Response Status Code设置响应状态代码时 FormsAuthentication.SignOut 失败
【发布时间】:2011-12-10 12:48:53
【问题描述】:

在 ASP.NET MVC3 控制器操作中,我想注销用户并返回 401 状态代码。代码很简单:

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();
}

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-3 forms-authentication


    【解决方案1】:
    public ActionResult Index()
    {
       FormsAuthentication.SignOut(); 
       return new HttpUnauthorizedResult();
    }
    

    【讨论】:

    • 这适用于非 AJAX 请求,但不适用于 AJAX 请求。在原帖中查看我的解决方案。
    【解决方案2】:

    当您设置状态码 401(未授权)时,浏览器不会继续保存您之前通过 SignOut() 调用设置的 cookie。

    要完全退出,您必须了解您需要给浏览器留出时间来写下 cookie(实际上是通过 SignOut 清除 cookie)。

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

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

    【讨论】:

    • 你让我在正确的轨道上使用 Response.Flush() 但是必须在设置状态码后调用 Response.Flush。在原帖中查看我的完整解决方案。
    猜你喜欢
    • 2011-09-04
    • 2021-04-24
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    • 2015-11-30
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多