Javascript MVC.NET提示用户登录

Javascript MVC.NET提示用户登录,javascript,asp.net-mvc,asp.net-mvc-3,jquery,asp.net-ajax,Javascript,Asp.net Mvc,Asp.net Mvc 3,Jquery,Asp.net Ajax,我不知所措。现在,如果用户的会话超时,我的站点将重定向到登录页面。我想解决的一个问题是,当用户在登录时单击操作按钮时,他们会创建一个ajax请求。 我想在ajax调用运行之前捕获超时,弹出一个模式对话框,提示用户输入用户名和密码,然后在成功登录后进行ajax调用。 我的主要目标是在成功登录后运行ajax调用,我不需要弹出窗口,但我认为这是最好的方法。 到目前为止,我所做的就是这样。我创造了一个控制器,它的人生目标是告诉我是否有超时。在ajaxStart函数中,我加载一个div,其中包含调用该控制

我不知所措。现在,如果用户的会话超时,我的站点将重定向到登录页面。我想解决的一个问题是,当用户在登录时单击操作按钮时,他们会创建一个ajax请求。 我想在ajax调用运行之前捕获超时,弹出一个模式对话框,提示用户输入用户名和密码,然后在成功登录后进行ajax调用。 我的主要目标是在成功登录后运行ajax调用,我不需要弹出窗口,但我认为这是最好的方法。 到目前为止,我所做的就是这样。我创造了一个控制器,它的人生目标是告诉我是否有超时。在ajaxStart函数中,我加载一个div,其中包含调用该控制器的结果。如果该div中的html包含单词“logon”,那么我调用window.showModalDialog。这有时有效,有时无效。对我来说,这感觉像是一个黑客,必须有更好的方式来完成它。有什么想法吗

function ajaxStart() {
        var timeoutTest = $('#timeoutTest');
        timeoutTest.load(timeoutUrl);
        if (timeoutTest.html().indexOf('Log On') != -1) {
            window.showModalDialog(logonUrl, "", "dialogHeight: 600; dialogWidth: 400");
        }

        tid = setTimeout(showSpinner, 500);
    }

我建议您看看,Phil Haack在其中演示了一种技术,该技术允许您配置应用程序,以便在身份验证票证过期且请求是使用AJAX发出的情况下发送401状态代码。然后,您可以很容易地在客户机上捕获401状态代码,并显示模式对话框。您甚至可以通过订阅事件处理程序对页面上发生的所有AJAX请求全局执行此操作,并在单个位置处理这些错误。

我建议您看看Phil Haack在其中演示的一种技术,该技术允许您将应用程序配置为在验证失败时发送401状态代码票证已过期,请求是使用AJAX发出的。然后,您可以很容易地在客户机上捕获401状态代码,并显示模式对话框。您甚至可以通过订阅事件处理程序对页面上发生的所有AJAX请求全局执行此操作,并在单个位置处理这些错误。

为什么不向timeoutTest添加一个HTML类?那你就可以了

timeoutTest.hasClass('logon');

为什么不在timeoutTest中添加一个HTML类呢?那你就可以了

timeoutTest.hasClass('logon');

使用ajax错误的问题在于重定向到登录页面实际上不是ajax错误,您可能需要将其用于其他事情。您的登录页面可能也不应该总是返回401IMHO,因为它实际上是一个公共页面

我确保我的登录页面返回一个我可以查找的自定义标题属性。我们使用了大量ajax,您可以使用一个全局脚本来查找它,这将阻止页面显示,并允许您做自己喜欢的事情

您的登录页控制器方法如下所示:

public ActionResult LogOn()
{

    Response.AddHeader("REQUIRES_AUTH", "1");
    return View();
}
然后在全局范围内,您可以使用这个jquery来处理它

$(document).bind("ajaxComplete", function (event, request, settings) {
    if (request.getResponseHeader("REQUIRES_AUTH") == "1") {
        ... addd popup code here.
    };
});

PS您的超时测试不总是有效的原因是您的超时测试必须在用户发布之前捕获到期。这真的有点像彩票,让ajax完成通常是最好的。记住,登录页面仍然是对ajax帖子的有效响应,只是不是我们想要的响应

使用ajax错误的问题是重定向到登录页面实际上不是ajax错误,您可能需要将其用于其他事情。您的登录页面可能也不应该总是返回401IMHO,因为它实际上是一个公共页面

我确保我的登录页面返回一个我可以查找的自定义标题属性。我们使用了大量ajax,您可以使用一个全局脚本来查找它,这将阻止页面显示,并允许您做自己喜欢的事情

您的登录页控制器方法如下所示:

public ActionResult LogOn()
{

    Response.AddHeader("REQUIRES_AUTH", "1");
    return View();
}
然后在全局范围内,您可以使用这个jquery来处理它

$(document).bind("ajaxComplete", function (event, request, settings) {
    if (request.getResponseHeader("REQUIRES_AUTH") == "1") {
        ... addd popup code here.
    };
});

PS您的超时测试不总是有效的原因是您的超时测试必须在用户发布之前捕获到期。这真的有点像彩票,让ajax完成通常是最好的。记住,登录页面仍然是对ajax帖子的有效响应,而不是我们想要的响应

我做了类似的事情来重定向到登录页面。我的目标不是重定向到登录页面。我的目标是让用户在发送ajax请求之前重新登录,然后一旦他们登录ajax请求就会继续。因此,流程如下所示。1.用户点击操作。2.检测到超时。3.系统将提示用户登录。4.用户登录。5.执行操作。@YetAnotherSoftwareDeveloper,如果不发送请求,就无法知道身份验证票证是否过期。所以流程应该是:1。您向操作2发送请求。您在客户端3上检测到401状态代码。显示允许用户输入其凭据的模式登录表单4。成功登录后,您将他重定向到他最初请求的页面。我的方法将允许您重新启动事件。当返回requires\u auth时,您只需将OUSUNDING函数/数据传入处理登录弹出窗口的方法。@YetAnotherSoftwareDeveloper,这就是我建议的原因
我建议您修改服务器逻辑以返回401 HTTP状态码,而不是重定向到登录页。您可以调整提交包含登录凭据的表单的过程,并在成功回调中重新运行初始AJAX请求,这一次将成功,因为身份验证cookie将被更新。我做了一些事情类似于重定向到登录页面。我的目标不是重定向到登录页面。我的目标是让用户在发送ajax请求之前重新登录,然后一旦他们登录ajax请求就会继续。因此,流程如下所示。1.用户点击操作。2.检测到超时。3.系统将提示用户登录。4.用户登录。5.执行操作。@YetAnotherSoftwareDeveloper,如果不发送请求,就无法知道身份验证票证是否过期。所以流程应该是:1。您向操作2发送请求。您在客户端3上检测到401状态代码。显示允许用户输入其凭据的模式登录表单4。成功登录后,您将他重定向到他最初请求的页面。我的方法将允许您重新启动事件。当返回requires\u auth时,您只需将OUSUNDING函数/数据传入处理登录弹出窗口的方法。@YetAnotherSoftwareDeveloper,这就是为什么我建议您修改服务器逻辑以返回401 HTTP状态代码,而不是重定向到登录页面。您可以简化提交包含登录凭据的表单的过程,并在成功回调中重新运行初始AJAX请求,这一次将成功,因为身份验证cookie将被删除更新。有趣。。。赶上暂停时间是个好主意。但是,在用户重新登录后,如何重新运行ajax调用?ajax请求已经完成。Pubsub是值得一看的订阅、激发事件。您可以挂接它并触发一次,然后如果它在登录逻辑后再次失败,只要登录响应也是ajax,我喜欢.net安全性和重定向,并且更愿意保留它,因为其他解决方案稍后会产生其他问题。诚然,这是一个更复杂的javascript解决方案,但我认为401有点黑客行为,如果你在整个网站上有不同的访问级别,甚至可能导致身份验证循环。+1解释海报的原始方法为什么不总是有效。有趣的。。。赶上暂停时间是个好主意。但是,在用户重新登录后,如何重新运行ajax调用?ajax请求已经完成。Pubsub是值得一看的订阅、激发事件。您可以挂接它并触发一次,然后如果它在登录逻辑后再次失败,只要登录响应也是ajax,我喜欢.net安全性和重定向,并且更愿意保留它,因为其他解决方案稍后会产生其他问题。诚然,这是一个更复杂的javascript解决方案,但我认为401有点黑客行为,如果你在整个网站上有不同的访问级别,甚至可能导致身份验证循环。+1解释海报的原始方法为什么不总是有效。