如何正确设置 CORS 设置

How to setup CORS setup correctly

我们有一个旧的 SharePoint 2010 服务器,我们想从那里请求网络内的数据。

我已经知道由于 CORS,我无法从其他服务器请求数据,但实际上据我了解,有可能允许此类请求。因此我需要修改服务器 HTTP 响应 headers,对吗?

我有这个设置,但实际上没有用。

服务器 - SharePoint 2010 - IIS:

我已将 Access-Control-Allow-Origin 设置为我笔记本的名称 (grolne-nb090)。在 JavaScript 应用程序中,我定义了以下请求:

onButtonClickHandler(event) {
    event.preventDefault();
    fetch('https://my.sharepointserver.com/sites/IT/_layouts/ArchiveSearch/ajax.aspx?requestType=test', {
        method: 'GET', 
        mode: 'cors',
        headers: {
            'Access-Control-Allow-Origin': 'http://grolne-nb090:3000',
            'Access-Control-Allow-Methods': 'GET, POST, PUT, PATCH, POST, DELETE, OPTIONS',
            'Access-Control-Allow-Headers': 'Content-Type,Authorization,Accept',
            'Content-Type': 'application/json', //'text/plain', //
            'Accept': 'application/json'
        },
        credentials: 'include'
    })
    .then((response) => {
        console.log('fetch data', response);
        return response.json();
      })
    .then((data) => {
        console.log('data',data);
    })
    .catch((error) => {
        console.error('Error on fetch request:', error);
    });
}

目前的错误信息是这样的:

Access to fetch at 'https://my.sharepointserver.com/sites/IT/_layouts/ArchiveSearch/ajax.aspx?requestType=test' from origin 'http://grolne-nb090:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

如果我将 mode 更改为 no-cors,我会得到一个 opaque 答案。

如何正确设置服务器/应用程序,以便我可以访问这些数据?我需要在服务器端设置哪个 HTTP 响应 headers 以及 JavaScript 请求是什么样子的?

一想,请求者URL也必须使用HTTPS吗?这会成为问题吗?

更新

我在谷歌上搜索了很多,似乎对 SharePoint 服务器的请求需要身份验证,而 pre-flight 没有提供。所以来自 SharePoint 的答案似乎是 pre-flight 的 401 Unauthorized,这会导致整个请求崩溃。

现在我正在搜索如何禁用单个 SharePoint 页面的身份验证...(或者如果可能的话)

我能够解决问题。 问题是,SharePoint 需要身份验证,而 pre-flight 中没有提供。所以 pre-flight 得到 401 Unauthorized 并且整个请求失败。 于是又看了一遍Mozilla的文章...

https://developer.mozilla.org/de/docs/Web/HTTP/CORS

... 并看到 pre-flight 没有在 simple requests 上完成(有关 simple requests 的详细信息,请参阅上面的 link)。 所以我这样更改了代码:

fetch('https://my.sharepointserver.com/sites/IT/_layouts/ArchiveSearch/ajax.aspx?requestType=test', {
    method: 'GET', 
    mode: 'cors',
    headers: {
        'Content-Type': 'text/plain', 
        'Accept': 'application/json'

    },
    credentials: 'include'
})

本例中的"magic"就是'Content-Type': 'text/plain'。然后请求被处理为 simple request 并且没有 pre-flight 发生。

我在 IIS 中设置的 HTTP 响应 headers 以这种方式工作,正如您在开头 post.

中看到的那样