配置跨来源资源共享 (CORS)

跨域资源共享(CORS)是一项 HTTP 功能,使 Web 应用程序能够在一个域中运行,以访问另一个域中的资源。 Web 浏览器实现一种称为同源策略的安全限制,该策略阻止网页在不同的域中调用 API。 但是,CORS 提供了一种安全的方法,允许源域在另一个域中调用 API。 Azure Cosmos DB 中的 NoSQL API 现在使用“allowedOrigins”标头支持跨域资源共享(CORS)。 为 Azure Cosmos DB 帐户启用 CORS 支持后,只会评估经过身份验证的请求,以确定是否根据指定的规则允许这些请求。

可以从 Azure 门户或 Azure 资源管理器模板配置跨域资源共享(CORS)设置。 对于使用适用于 NoSQL 的 API 的 Azure Cosmos DB 帐户,Azure Cosmos DB 支持在基于 Node.js 和基于浏览器的环境中运行的 JavaScript 库。 使用网关模式时,此库现在可以利用 CORS 支持。 使用此功能不需要客户端配置。 借助 CORS 支持,浏览器中的资源可以直接通过 JavaScript 库REST API 直接访问 Azure Cosmos DB,以便执行简单作。

注释

CORS 支持仅适用于 Azure Cosmos DB for NoSQL。 它不适用于适用于 Cassandra、Gremlin 或 MongoDB 的 Azure Cosmos DB API,因为这些协议不使用 HTTP 进行客户端-服务器通信。

从 Azure 门户启用 CORS 支持

按照以下步骤使用 Azure 门户启用跨域资源共享:

  1. 导航到 Azure Cosmos DB 帐户。 打开 CORS 页。

  2. 指定一个逗号分隔的源列表,该列表可以对 Azure Cosmos DB 帐户进行跨域调用。 例如:https://www.mydomain.comhttps://mydomain.comhttps://api.mydomain.com。 还可以使用通配符“*”允许所有源并选择 “提交”。

    注释

    目前,不能将通配符用作域名的一部分。 例如 https://*.mydomain.net 格式尚不支持。

    使用 Azure 门户启用跨域资源共享

从资源管理器模板启用 CORS 支持

若要使用资源管理器模板启用 CORS,请将带有“allowedOrigins”属性的“cors”部分添加到任何现有模板。 此 JSON 是创建启用了 CORS 的新 Azure Cosmos DB 帐户的模板示例。

{
  "type": "Microsoft.DocumentDB/databaseAccounts",
  "name": "[variables('accountName')]",
  "apiVersion": "2019-08-01",
  "location": "[parameters('location')]",
  "kind": "GlobalDocumentDB",
  "properties": {
    "consistencyPolicy": "[variables('consistencyPolicy')[parameters('defaultConsistencyLevel')]]",
    "locations": "[variables('locations')]",
    "databaseAccountOfferType": "Standard",
    "cors": [
      {
        "allowedOrigins": "https://contoso.com"
      }
    ]
  }
}

从浏览器使用 Azure Cosmos DB JavaScript 库

如今,Azure Cosmos DB JavaScript 库仅包含包所附的 CommonJS 版本。 若要从浏览器使用此库,必须使用汇总或 Webpack 等工具来创建浏览器兼容的库。 某些 Node.js 库应具有浏览器模拟器。 这是具有所需模拟设置的 Webpack 配置文件的示例。

const path = require("path");

module.exports = {
  entry: "./src/index.ts",
  devtool: "inline-source-map",
  node: {
    net: "mock",
    tls: "mock"
  },
  output: {
    filename: "bundle.js",
    path: path.resolve(__dirname, "dist")
  }
};

下面是将 TypeScript 和 Webpack 与 Azure Cosmos DB JavaScript SDK 库配合使用的 代码示例 。 该示例生成一个 Todo 应用,用于在创建新项时发送实时更新。

后续步骤

若要了解保护 Azure Cosmos DB 帐户的其他方法,请参阅以下文章: