在身份验证后运行Javascript而不是重定向

时间:2011-02-07 04:56:08

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

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

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

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

public ActionResult LogOn(LogOnModel model, string returnUrl)

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

2 个答案:

答案 0 :(得分:3)

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

- 修正后的答案 -

你需要做的是在你继续做任何你想做的事情之前检查ajax调用的响应代码.jQuery 1.5&#39的ajax()方法允许你这样做:

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

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

希望这对你更有帮助。

答案 1 :(得分:2)

“Chad Ruppert”的回答是正确的。但如果您不明白,请遵循以下算法。

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

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

3)如果验证通过,则调用回调函数 (回调函数没有,但你的SAVE())