【问题标题】:Different behavior in GET vs. POST Ajax requestGET 与 POST Ajax 请求中的不同行为
【发布时间】:2011-07-18 20:36:53
【问题描述】:

我们有一个 MVC 应用程序,它使用控制器作为 AJAX 端点,并使用 FormsAuth 进行身份验证。

我遇到了一个有趣的场景,其中 GET 请求的行为与 POST 请求的行为不同(都针对未经授权的用户)。

在这种特殊情况下,我们的自定义 ControllerFactory 会运行以下代码来尝试访问此控制器:

FormsAuthentication.SignOut();
requestContext.HttpContext.Response.Redirect(FormsAuthentication.LoginUrl);
throw new UnauthorizedAccessException();

(我意识到在 AJAX 请求中重定向没有意义,但请耐心等待)。

当我对此控制器执行 GET 请求 (AJAX) 时,客户端会收到 401 - Unauthorized 异常,我可以在客户端捕获该异常并将用户重定向到登录页面。

当我向该控制器发出 POST 请求 (AJAX) 时,我收到 302,并且我的请求被重定向到我的登录页面。

为什么 GET 和 POST 请求的行为不同?

【问题讨论】:

  • 控制器工厂试图运行的代码不是它的责任 => 控制器工厂应该实例化控制器,而不是执行身份验证。为此,您有 [Authorize] 属性。
  • @Darin - 我知道,事实上,在这段代码的正上方有一条评论说这是一个 hack。 :D 这一事实源于这样一个事实,即如果用户未登录(由于我们的 IoC 容器的设置方式),则无法构造某些控制器。然而,再一次,与这个问题无关。 :D
  • 我只是在这里提到最佳实践。您没有遵循这些做法并遇到问题这一事实并不让我感到惊讶。这样做的人总是会发生 :-) 所以摆脱黑客,以正确的方式做事并快乐。如果您不确定是否提供了允许重现问题的完整示例。您在问题中发布的 3 行代码还远远不够。
  • 添加指向我的其他问题的链接以尝试修复黑客:stackoverflow.com/questions/6739899/…
  • 我已经为您的 spring.net 问题发布了一个简单的答案:stackoverflow.com/questions/6739899/…

标签: ajax asp.net-mvc-2 forms-authentication


【解决方案1】:

所以我采纳了 Darin 的建议,做了一些重构,我不再遇到这个问题。 :) 我发现了我的问题的根源,那就是我们有一个用于 MVC 错误处理的属性,它没有 IExceptionFilter 属性,所以有些事情是以不确定的顺序发生的。感谢您的帮助。 ;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 2018-01-10
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多