jQuery核心与移动野生动物园

时间:2014-03-27 02:52:13

标签: jquery ajax ipad safari cors

我最近一直致力于让CORS在我已经构建的一些Web应用程序上工作,但是在我们公司的iPad上进行移动游猎时遇到了一个神秘的问题。

环境崩溃,我有一个托管网页的前端服务器。然后,我有两个不同的后端服务器,Sharepoint 2013和CRM 2011.这两个服务器都有我正在尝试从前端服务器上发布的应用程序访问的REST服务。

在两台后端服务器上,我在IIS中将响应标头设置为:

  • Access-Control-Allow-Origin:frontEndServerServername
  • Access-Control-Allow-Credentials:true
  • 访问控制允许方法:GET,POST,PUT,DELETE,OPTIONS
  • Access-Control-Allow-Headers:Content-Type,Authorization,Accept,Origin

在我的$ .ajax电话中,我添加了

xhrFields:{withCredentials:true}。

现在看起来像一个简单的查询:

function getRequestDigestTEST() {
$.support.cors = true;
$.ajax({
url: 'http://sharepoint/_api/contextinfo',
method: "POST",
headers: { "Accept": "application/json; odata=verbose" },
xhrFields: { withCredentials: true },
success: function(results) {
requestDigest = results.d.GetContextWebInformation.FormDigestValue;
},
error: function (error) {
alert(error.status);
}
});
} 

这一切都适用于任何桌面浏览器,但我的问题是手机游戏。在iPad上,我获得401未经授权的返回。当我在IIS上启用跟踪时,后端服务器会将从移动版Safari中传递的身份验证视为匿名。在桌面浏览器中,我看到NTLM具有正确的用户名。

我还尝试将用户名/密码属性添加到ajax调用,但即使那些似乎也没有传递给Web服务,因为跟踪仍然报告匿名身份验证类型。

我一直在寻找,似乎无法找到任何可以让iPad与后端资源对话的东西。

1 个答案:

答案 0 :(得分:0)

对于Sharepoint,我能够让它在ajax调用上设置2个设置,但CRM我必须构建自己的Web服务,就像REST调用的代理一样。

除非您在Sharepoint上进行匿名设置(您很可能没有或想要),否则ajax调用会进行预调用。为了在预调用中进行身份验证,我们需要在ajax调用函数中设置头信息。

authPreCall = function(req) { req.setRequestHeader("Authorization", sessionStorage.getItem("LoginToken")); };

在我的所有应用程序中,我现在检查最终用户是否在iOS设备上,如果是,我将它们转发到长屏幕,我根据输入的凭据生成登录令牌。当他们需要访问Web服务时,我会检索会话令牌并将其传递给服务。

需要的另一个ajax设置是“xhrfields”。

authFields = { withCredentials:true };

然后我将authFields变量传递给ajax调用的xhrfields属性。

在我的初始帖子列表中,还需要为要访问的Sharepoint站点输入所需的IIS属性。

同样,CRM是另一种动物,因为这些设置不起作用,我必须构建一个.NET Web服务,该服务将对CRM进行身份验证并从那里执行REST查询。因此,从javascript开始,我创建了一个包含我需要完成的REST查询的有效负载对象,然后Web服务执行它并将结果交还给接口。

希望这会有所帮助......