【问题标题】:mvc 3, jquery ajax & forms authenticationmvc 3、jquery ajax 和表单身份验证
【发布时间】:2011-07-31 17:51:23
【问题描述】:

在我的 MVC3 项目中,我有一个带有 [Authorize] 属性的控制器。 我有一个没有 ajax 的表单提交,如果他/她没有登录,它会将用户(如预期)重定向到登录屏幕。

但是,现在我有一个使用 jquery ajax 提交的表单,我该如何做同样的事情?将用户重定向到登录屏幕,如果他/她没有被授权?成功登录后,用户应该被重定向到初始操作。

控制器

[Authorize]
[ValidateInput(false)] 
public JsonResult SubmitChatMessage(string message)
        {
            if (!string.IsNullOrEmpty(message))
            {
                // Do stuff
            }

            // Return all chat messages
            return GetChatMessages();
        }

客户端 JQUERY

$(document).ready(function () {
    $("form[action$='SubmitChatMessage']").submit(function (event) {
        $.ajax({
            url: $(this).attr("action"),
            type: "post",
            dataType: "json",
            data: $(this).serialize(),
            success: function (response) {
                // do stuff
            }
        });
        return false; 
    });
});

我可以从 firebug 控制台窗口看到,服务器返回:

GET http://domain/Account/LogOn?ReturnUrl=%2fProductDetails%2fSubmitChatMessage

期待您的帮助!

更新了可能的解决方案

【问题讨论】:

  • 如果您只是重定向,那么 AJAX 登录的意义何在?为什么不只使用常规形式?
  • 重点是,登录用户应该能够使用 ajax 向控制器提交一些数据。如果他们没有登录怎么办?如何使用 jquery ajax 处理这种情况?
  • 对,我的错 - 我误解了。已添加答案。

标签: jquery ajax asp.net-mvc-3 forms-authentication authorize


【解决方案1】:

是的,这是我一直讨厌关于 ASP.NET 中的表单身份验证的一件事 - 根本不适合 AJAX 身份验证。将处理 401 的 IIS 添加到混合中,这可能会很痛苦。

有几种方法可以做到这一点,但没有一种特别“干净”。

这些包括:

  1. 在控制器中设置一个ViewBag标志,对应Request.IsAuthenticated,如果没有认证,则将提交按钮点击事件重写到登录页面。

  2. 让您的 AJAX 操作返回 JsonResult,这是“代码”的属性。其中 0 表示成功,1 表示未通过身份验证,2 表示其他数据问题,等等。然后在 complete $.ajax 回调中检查该代码并重定向到登录页面。

  3. 检查$.ajax jqXHR 响应对象的状态码403,并重定向到登录页面。

  4. 为您的提交按钮编写自定义 HTML 帮助程序,根据身份验证状态呈现常规提交按钮或转到登录页面的锚标记。

  5. 编写一个自定义授权属性来检查是否Request.IsAjaxRequest(),并返回一个自定义JSON对象,而不是重定向到登录页面的默认行为(AJAX请求不会发生)。

【讨论】:

  • 感谢您提供不同的解决方案。我将使用与您的答案相关的其他帖子更新我的问题,其中对不同的解决方案进行了更详细的描述。
  • 如果用户未登录,您能否在 C# 函数中重定向到操作(到会话超时或登录屏幕?)?
【解决方案2】:

说实话,这有点痛苦。在我看来,更重要的是,如果您使用的是联合身份,例如 Windows Identity Foundation 和/或 Azure AppFabric 访问控制服务。

您的 Ajax 调用无法处理重定向。

我的解决方案/建议不是用 [Authorize] 标记您的 Ajax 调用控制器操作方法,而是依赖于您从具有 [Authorize] 的控制器操作插入到会话状态中的某些值的存在(通常是调用以显示视图的控制器操作方法)。您知道除非用户经过身份验证(并且会话尚未超时),否则该值不能进入会话状态。如果此值不存在,则调用您的 Ajax 方法失败,返回一个特定的 JSON 结果,您可以在客户端代码中优雅地处理该结果。

在 Ajax 控制器方法上使用 [Authorize] 会导致奇怪的、通常是隐藏的错误(例如更新消失)。

【讨论】:

  • 你说得对,这太痛苦了。使用会话状态其实是一个不错的解决方案,我会考虑的。
猜你喜欢
  • 1970-01-01
  • 2011-10-19
  • 2012-11-05
  • 2023-03-22
  • 1970-01-01
  • 2012-02-24
  • 1970-01-01
  • 2014-06-06
  • 1970-01-01
相关资源
最近更新 更多