【问题标题】:How to setup CORS setup correctly如何正确设置 CORS 设置
【发布时间】:2020-04-06 05:04:48
【问题描述】:

我们有一个旧的 SharePoint 2010 服务器,我们希望从该服务器请求网络内的数据。

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

我有这个设置,但它实际上不起作用。

服务器 - 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);
    });
}

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

访问获取 'https://my.sharepointserver.com/sites/IT/_layouts/ArchiveSearch/ajax.aspx?requestType=test' 来自 'http://grolne-nb090:3000' 的来源已被 CORS 阻止 策略:对预检请求的响应未通过访问控制 检查:它没有 HTTP ok 状态。

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

如何正确设置服务器/应用程序,以便访问这些数据?我需要在服务器端设置哪些 HTTP 响应标头以及 JavaScript 请求的外观如何?

想一想,请求者 URL 是否也必须使用 HTTPS?这可能是个问题吗?

更新

我搜索了很多,似乎对 SharePoint 服务器的请求需要身份验证,而飞行前不提供。因此,来自 SharePoint 的答案似乎是飞行前的 401 Unauthorized,这会使整个请求崩溃。

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

【问题讨论】:

  • 你检查过共享点日志吗?
  • 是的,但实际上没有任何帮助。请求的 3 个条目。 2 个“监控”类别和 1 个“记录相关数据”类别条目。
  • 安装 IIS CORS 模块,而不是使用您的自定义响应标头 blogs.iis.net/iisteam/introducing-iis-cors-1-0,然后将其配置为处理预检请求。
  • IIS 可以为信号 aspx 页面设置身份验证。但是我不熟悉sharepoint。如果sharepoint使用IIS认证,可以在applicationhost.config中添加设置信号页匿名认证。
  • @LexLi 感谢您提供该工具的链接。我不知道它的存在。但实际上我也想了解 CORS 是如何工作的。因此,有时深入研究主题比使用工具更好。 ;-)

标签: javascript iis cors sharepoint-2010


【解决方案1】:

我能够解决这个问题。 问题是,SharePoint 需要身份验证,这在飞行前未提供。所以飞行前得到一个401 Unauthorized 并且完整的请求失败。 于是又看了一遍Mozilla的文章……

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

... 并看到 simple requests 上没有进行预飞行(有关 simple requests 的详细信息,请参阅上面的链接)。 所以我这样改代码:

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'
})

在这种情况下,“魔法”是'Content-Type': 'text/plain'。然后请求被处理为simple request,并且没有发生预飞行。

我在IIS 中设置的 HTTP 响应标头以这种方式工作,如您在开篇帖子的图像中所见。

【讨论】:

    猜你喜欢
    • 2020-01-07
    • 2016-08-12
    • 1970-01-01
    • 2020-02-21
    • 2021-10-31
    • 1970-01-01
    • 2014-11-09
    • 2017-03-23
    • 2022-06-30
    相关资源
    最近更新 更多