401试图实施SharePoint的CORS

我想从位于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响应头:

  • Access-Control-Allow-Credentials:true
  • Access-Control-Allow-Headers:起源,内容类型,接受
  • Access-Control-Allow-Origin:*
  • 访问控制请求方法:POST,GET,HEAD,OPTIONS
  • Windows身份验证在我的Web应用程序的IIS中启用,并且我没有在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
    

    迟到的回应,但我发现另一个线程这里有一个简单的解决方案为IIS和哪些为我工作。

    基本上,CORS标准规定,预检请求不应该发送任何认证信息,因此也就是401.在该线程中,有一个限制对OPTIONS动词的匿名请求的例子,允许对预检(OPTIONS)动词的200响应请求,但仍然需要其他人的认证。


    我不确定你的意思是“匿名身份验证被禁用”,但听起来这正是你得到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'
    });
    

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

    链接地址: http://www.djcxy.com/p/13545.html

    上一篇: 401 when trying to implement CORS for SharePoint

    下一篇: verifying data consistency between two postgresql databases