javascript - AD FS 2.0 身份验证和 AJAX

标签 javascript jquery ajax adfs2.0

我有一个网站试图调用另一个网站上的 MVC Controller 操作。这些站点都设置为 AD FS 2.0 中的信赖方信任。在两个站点之间的浏览器窗口中打开页面时,一切都经过身份验证并且工作正常。但是,当尝试使用 jQuery AJAX 方法从 JavaScript 调用 Controller 操作时,它总是失败。这是我正在尝试做的代码片段......

$.ajax({
  url: "relyingPartySite/Controller/Action",
  data: { foobar },
  dataType: "json",
  type: "POST",
  async: false,
  cache: false,
  success: function (data) {
    // do something here
  },
  error: function (data, status) {
    alert(status);
  }
});

问题是 AD FS 使用 JavaScript 向依赖方发布隐藏的 html 表单。 使用 Fiddler 进行跟踪时,我可以看到它到达 AD FS 站点并返回此 html 表单,该表单应发布并重定向到经过身份验证的 Controller 操作。问题是这种形式作为 ajax 请求的结果返回并且显然会因解析器错误而失败,因为 ajax 请求需要来自 Controller 操作的 json。这似乎是一种常见的情况,那么从 AJAX 与 AD FS 通信并处理这种重定向的正确方法是什么?

最佳答案

您有两个选择。 更多信息 here .

第一个是在入口应用程序(基于 HTML 的应用程序)和您的 API 解决方案之间共享 session cookie。您将这两个应用程序配置为使用相同的 WIF cookie。这仅在两个应用程序位于同一根域时才有效。 请参阅以上帖子或此 stackoverflow question .

另一个选项是禁用 AJAX 请求的被动重定向(如 Gutek's answer )。这将返回 401 的 http 状态代码,您可以在 Javascript 中处理它。 当您检测到 401 时,您会在 iFrame 中加载一个虚拟页面(或一个“身份验证”对话框,如果需要再次提供凭据,它可以兼作登录对话框)。当 iFrame 完成后,您可以再次尝试调用。这次 session cookie 将出现在调用中,它应该会成功。

//Requires Jquery 1.9+
var webAPIHtmlPage = "http://webapi.somedomain/preauth.html"

function authenticate() {
    return $.Deferred(function (d) {
        //Potentially could make this into a little popup layer 
        //that shows we are authenticating, and allows for re-authentication if needed
        var iFrame = $("<iframe></iframe>");
        iFrame.hide();
        iFrame.appendTo("body");
        iFrame.attr('src', webAPIHtmlPage);
        iFrame.load(function () {
            iFrame.remove();
            d.resolve();
        });
    });
};

function makeCall() {
    return $.getJSON(uri)
                .then(function(data) {
                        return $.Deferred(function(d) { d.resolve(data); });
                    },
                    function(error) {
                        if (error.status == 401) {
                            //Authenticating, 
                            //TODO:should add a check to prevnet infinite loop
                            return authenticate().then(function() {
                                //Making the call again
                                return makeCall();

                            });
                        } else {
                            return $.Deferred(function(d) {
                                d.reject(error);
                            });
                        }
                });
}

关于javascript - AD FS 2.0 身份验证和 AJAX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7746222/

相关文章:

javascript - 重力和冲击错误

javascript - jquery Ajax 不发送 JSON 数据

javascript - 将 Div 内容复制到第二个 Div

javascript - AJAX 监听器而不是轮询?

javascript - 无法使用 jQuery removeProp() 删除 "lang"属性

javascript - 将 DOM 元素移动到新窗口并在 IE 11 中维护事件监听器

javascript - 如何获取 ID 集合以及从 View 表传递到 Controller 的选定下拉列表值?

javascript - Ajax 从不调用我的 .NET 方法?

javascript - 如何在 mvc 4 中不使用模型进行客户端验证

Javascript负 float 计算