JavaScript 弹出窗口阻止程序和 Ajax 回调 - C# MVC 应用程序

javascript popup blocker and ajax callback - C# MVC app

本文关键字:回调 Ajax 应用程序 MVC 程序 窗口 JavaScript      更新时间:2023-09-26

将表单发布到 url 的安全网站中,有 2 个要求:

  1. 如果身份验证票证仍然有效,则表单将发布到窗口,否则同一窗口会将用户重定向到登录页面。
  2. 将表单发布到新窗口不会调用弹出窗口阻止程序。

我已经编写了一个 ajax 操作来获得有关身份验证是否仍然有效的正确答案。 但是我无法让重定向代码进入脚本执行上下文之外,从而避免弹出窗口阻止程序。请帮忙!

JavaScript:

    $('#someSystem').click(function () {
        //deferred promise?
        auth().done(function (result) {
            //need to move below code outside this callback without side effects
            if (result == 'true') {
                var form = $('#ssoForm');
                form.submit();
            }
            else {
                window.location.href = "/account/login";
            }
        });
        return false;
    });
    function auth() {
        return $.ajax({ url: '/account/isauthenticated', method: "POST" });
    }

已通过身份验证的用户的 HTML

<form action="/sso/somesystem" id="ssoForm" method="post" target="_blank">
    ...
    <div id="someSystem">Continue</div>
</form>

我不相信除了调整弹出窗口块来避免它之外,您将无法做任何事情。如果js可以做到这一点,它几乎会完全破坏阻止程序的目的。此外,您还应该考虑在js中进行重定向的安全性,因为代码在用户空间中。 用户可以从其浏览器取消重定向。

相反,为什么不在服务器上进行检查并使用

 RedirectToAction() 

在阅读了几篇jQuery帖子甚至signalR之后,这篇 codeproject.com 的文章对我的情况最有帮助。似乎有一种更简单的方法来解决这个问题。开发人员不知道身份验证在给定时间是否有效,但肯定知道它会过期多长时间。这些知识可以用JavaScript硬编码,并且可以先发制人地(setTimeout)向用户发送警报,而不是等待他们点击然后尝试找出答案。这种方法不会让我打扰弹出窗口阻止程序。