【发布时间】: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