【问题标题】:Run Javascript after authentication instead of redirecting身份验证后运行 Javascript 而不是重定向
【发布时间】:2011-02-07 04:56:08
【问题描述】:

短版:在收到 AJAX ASP.NET 成员身份验证响应后,留在同一页面上运行第二个 AJAX 调用的最佳方式是什么?

加长版:想象一个基于 ASP.NET MVC 的基于 Web 的画图程序。用户绘制图片,在此期间用户的会话已超时。用户点击“保存”并通过 AJAX 对话框提示“您的会话已超时。请在下面输入您的凭据。” (有关如何进行 AJAX 身份验证,请参阅jQuery Forms Authentication with ASP.NET MVC。)输入有效凭据后,用户将重新进行身份验证。

通常,此时,用户会被重定向到returnUrl,这可以从 MVC 的默认登录方法签名中看出:

public ActionResult LogOn(LogOnModel model, string returnUrl)

但是,在这种情况下,我希望留在同一页面上,而是对我的处理程序SaveArt() 进行 AJAX 调用,它将用户的工作写入数据库。我可以劫持 returnUrl 让它包含我想调用的后续 Javascript 函数的名称,但我能想到从客户端执行它的唯一方法是使用可怕的 eval,它根本没有看起来很安全。有没有另一种方法来完全 AJAXify 这个过程?在这里使用eval 来运行名称由服务器返回的函数有什么危险?

【问题讨论】:

    标签: javascript jquery asp.net-mvc ajax authentication


    【解决方案1】:

    如果您使用 Ajax 请求进行登录,您可以修改 accountcontroller 以使用 Request.IsAjaxRequest()(或其他几种方法之一)检测它并返回一个带有登录请求结果的 json 对象而不是重定向。从那里您只需要处理该对象即可显示结果。

    --修改后的答案--

    您需要做的是检查 ajax 调用的响应代码,然后再继续您想做的任何事情。jQuery 1.5 的 ajax() 方法允许您这样做:

    $.ajax({
      statusCode: {404: function() {
        alert('page not found');
      }
    });
    

    在您的情况下,如果您确实使用了 [Authorize] 属性,则必须处理 401 状态代码。您可能会在其中显示登录对话框。当您实例化您的登录对话框时,传入一个再次调用 SaveArt() 函数的闭包。

    希望这对您更有帮助。

    【讨论】:

    • 仔细阅读问题。我已经知道如何“处理该对象并显示结果”。我不确定的是如何在结果之后调用另一个 JS 函数。基本上,Save 点击处理程序应该在需要时通过 AJAX 登录,然后调用第二个 AJAX 方法来保存艺术作品。登录响应处理程序如何知道调用 Save,而该函数名称仅在原始单击时才知道?
    • 对不起,先生,但是“用户点击“保存”并提示 AJAX 对话框”向我表明您已经超出了处理丢失会话结果的操作的地步标记为 [已授权]。我确实误读了您正在寻找的解决方案。相反,我只给了你想要的后半部分。修改答案。
    • 这很有用,谢谢。但是,此解决方案需要在每个 AJAX 请求上使用自定义错误处理程序,Save 只是其中之一。有没有办法将 preauth 重构为一个函数调用,如CallWithAuthentication(Save)?这是一个帮助器,它在需要时进行身份验证,然后执行它作为参数接收的任何函数指针。问题在于登录成功处理程序无法访问Save 函数指针参数,除非服务器返回它。
    • 是的,你可以这样做。除非您在做跨域的工作,否则访问保存调用应该不会有问题。修改您的方法调用,使其看起来更像 CallWithAuthentication(function(){Save();});即关闭。
    【解决方案2】:

    “Chad Ruppert”的答案是正确的。但是如果你不明白,请按照下面的算法。

    1) 声明一个 javascript 函数,使用参数进行 AJAX 调用以进行身份​​验证 i) 用户名​​ ii) 密码 iii) 回调函数

    2) 在 AJAX 调用的响应中,您可能知道 user/psd 是否正确的验证结果。

    3) 如果验证通过,则调用回调函数 (回调函数不是你的 SAVE())

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-11
      • 2021-11-27
      • 1970-01-01
      • 2011-12-13
      • 1970-01-01
      • 2011-02-18
      • 2016-05-13
      • 2017-12-24
      相关资源
      最近更新 更多