3

我有一个使用 Windows 身份验证的 Web 应用程序,它使用我们 Intranet 上不同服务器上的 Windows 身份验证来调用 Web 服务。具体来说,我正在使用带有 SSL 的 jQuery 跨域对 WCF 休息服务 ( WebHttpBinding) 进行 ajax 调用。

我通过在 Web 服务中设置 Access-Control-Allow-Origin 标头解决了跨域问题。并在 jquery 中调用 ie 通过设置$.support.cors = true;.

我通过设置标头解决了发送凭据的问题("Access-Control-Allow-Credentials", "true");在 Web 服务和 jQuery 调用中通过设置

$.ajaxSetup({ xhrFields: { withCredentials: true, crossDomain: true

        }
    });

我让这适用于 IE 和 Chrome,使用在不同服务器上运行的 Windows 身份验证从 Web 应用程序使用 Windows 身份验证对 Web 服务进行跨域。但是,当我将 SSL 添加到双方(https 到 https)时,该调用在 IE 中不再有效。它继续在 Chrome 中工作。

查看 Fiddler 中的 http 流量,浏览器似乎甚至没有发出请求,也就是说,Fiddler 根本没有显示请求已发出的条目。通过调试 javascript,我可以捕获从 jquery 调用返回的错误,并且状态文本是“访问被拒绝”。但正如我所说,在我看来,浏览器甚至没有将请求发送到 Web 服务。

我尝试了一个 jquery cors 插件jQuery.XDomainRequest.js。那时我开始在 fiddler 中看到 http 调用。这是一个单一的 401“拒绝访问”。就是这样。客户端调用似乎没有发送任何凭据。

在此之前,在我添加 SSL 之前,我会看到一个 401,其中包含身份验证凭据的响应标头。随后是 200,其中请求标头包含 Windows 身份验证凭据。所以它奏效了。

但是现在(在 IE 中)我只得到了单个 401。所以我被卡住了,我需要打电话

  1. 跨域,
  2. 使用 Windows 身份验证,
  3. 使用 SSL 和
  4. 与 IE。

我可以把所有四个要求结合在一起。我很困惑为什么我可以使用 windows auth 跨域来使用 IE,但是当我添加 SSL 时我无法让它工作。

它在 Chrome 中运行良好,因此它必须与 XDomainRequest 对象有关。有什么方法可以调整 jQuery 调用以使这一切正常工作。有没有人听说过这个特定的问题?这是可以克服的吗?还是我只是把头撞在墙上?

4

2 回答 2

1

也许 OP 的问题只是一个 IE9 问题,但我在现代浏览器中也遇到了一些麻烦。我发现如果您需要 Windows 身份验证才能工作,则不能*用于标头。Access-Control-Allow-Origin

跨域服务器(ajax请求的目标)需要在Access-Control-Allow-Originheader中完整指定宿主服务器(ajax调用来自的域)。

也许 OP 正在这样做,但对我来说,这是缺失的部分。我现在有 jQuery ajax,带有xhrFields: { withCredentials: true }和通常的 CORS 标头,它适用于 IE11、https、windows auth、跨域。它也适用于其他浏览器。它适用于获取和发布。

我遇到的另一个问题......我只在“OPTIONS”请求上设置了我的 CORS 标头,但这有时不起作用,所以我现在只是将这些标头添加到每个请求中。我只是在我的 ASP.NET MVCApplication_BeginRequest方法中添加这些,如下所示。

HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "https://portal");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true");

这是 JavaScript 端的一个片段

$.ajax({
    url: "<a url in here>"
    type: "POST",
    xhrFields: {
      withCredentials: true
    },
    contentType: "application/json",
    data: payload,
    success: success,
    error: function (data) {
        logFailure(data);
    }
});
于 2015-06-04T23:30:34.560 回答
0

XDomainRequest 明确禁止使用身份验证;在这里看到#5:http: //blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx

不清楚JQuery跨域调用在IE9及以下是如何工作的,除了通过XDomainRequest对象外不支持CORS。在 IE10 中,这应该可以正常工作。

于 2012-11-28T16:18:55.460 回答