7

我想从位于 domainB.contoso.com 的 Web 应用程序访问位于 domainA.contoso.com 的 listdata.svc(共享点服务) - 身份验证似乎是一个问题。

当尝试通过 JQuery Ajax 调用访问 ListData.svc 并启用 CORS 时,服务器返回 401。如果我从 SharePoint 内部执行的 .htm 页面运行相同的查询,则调用工作正常,因为域是相同。

SharePoint 使用 NTLM 并关闭了匿名身份验证 - 我认为 401 是 Windows 凭据未传递到 SharePoint 服务器的结果 - 但我不知道如何将这些凭据正确添加到标题中。 我设置了 xhrFields: { withCredentials: true },但这似乎并不能纠正身份验证问题。

为了启用 CORS,我在 IIS 中的 SharePoint 上设置了以下 HTTP 响应标头:

  • 访问控制允许凭据:true
  • 访问控制允许标头:来源、内容类型、接受
  • 访问控制允许来源:*
  • 访问控制请求方法:POST、GET、HEAD、OPTIONS

在 IIS 中为我​​的 Web 应用程序启用了 Windows 身份验证,并且我没有在 IIS 中设置“OPTIONSVerbHandler”HTTP 处理程序。将其转为阅读似乎没有什么不同。

JQuery Ajax 调用(来自 subdomainB.contoso.com 上的应用程序):

 $.ajax({
        type: "GET",
        contentType: "application/json; charset=utf-8",
        url: listUrl,
        xhrFields: { withCredentials: true },
        crossDomain:true,  
        processData: false,
        async: true,
        dataType: "json",
        converters: {
            // WCF Data Service .NET 3.5 incorrectly escapes singles quotes, which is clearly
            // not required (and incorrect) in JSON specs.
            // http://bugs.jquery.com/ticket/8320?cversion=0&cnum_hist=1
            "text json": function (textValue) {
                return jQuery.parseJSON(textValue.replace(/(^|[^\\])\\'/g, "$1'"));
            }
        },
        success: function (data, status, xhr) {
            //successFunc(data.d.results);
            alert("working!");
        },
        error: function (xhr, status, error) {
            alert("failure!");
        }
    });

HTTP 标头和 401 响应:

Key Value
Request OPTIONS /_vti_bin/ListData.svc/Contacts HTTP/1.1
Accept  */*
Origin  http://domainB.contoso.com
Access-Control-Request-Method   GET
Access-Control-Request-Headers  content-type, accept
Accept-Encoding gzip, deflate
User-Agent  Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)
Host    domainA.contoso.com
Content-Length  0
DNT 1
Connection  Keep-Alive
Cache-Control   no-cache

Key Value
Response    HTTP/1.1 401 Unauthorized
Server  Microsoft-IIS/7.5
SPRequestGuid   1e33061c-f555-451b-9d69-0d83eff5f5ea
WWW-Authenticate    NTLM
X-Powered-By    ASP.NET
MicrosoftSharePointTeamServices 14.0.0.4762
Access-Control-Allow-Headers    Origin, Content-Type, Accept
Access-Control-Allow-Origin *
Access-Control-Request-Methods  POST, GET, HEAD, OPTIONS
Access-Control-Allow-Credentials    true
Date    Wed, 15 May 2013 15:04:51 GMT
Content-Length  0
4

3 回答 3

3

迟到的响应,但我在这里找到了另一个线程,它有一个简单的 IIS 解决方案并且对我有用。

基本上,CORS 标准指定预检请求不应发送任何身份验证信息,因此是 401。在该线程中有一个将匿名请求限制为 OPTIONS 动词的示例,它允许对预检(OPTIONS 动词)请求做出 200 响应,但仍需要其他人的身份验证。

于 2015-01-06T12:08:39.780 回答
0

我不确定您所说的“匿名身份验证已禁用”是什么意思,但这听起来正是您收到 401 ( Unauthorized) 响应的原因。它与 CORS 无关,但服务器告诉客户端它需要用户名和密码才能允许访问。

尝试将用户名和密码传递给$.ajax()警告:这只是为了测试这是否可以解决您的问题,在您的 JS 代码中硬编码这些细节是一个坏主意):

$.ajax({
  crossDomain:true,    
  url: listUrl,
  username: VALID_USERNAME,
  password: VALID_PASSWORD,
  success: function(data){alert("hello json!") },
  error: function() {
    alert("epic fail");
  },
  dataType:'json'
});
于 2013-05-14T18:16:36.293 回答
0

当客户端发送“withCredentials: true”时,您不能在服务器上对 Access-Control-Allow-Origin 使用通配符 (*)。
您必须明确设置域。
CORS:当凭据标志为真时,无法在 Access-Control-Allow-Origin 中使用通配符

于 2017-11-20T16:55:43.613 回答