保护数据 API 生成器解决方案

数据 API 生成器通过 REST 和 GraphQL 终结点公开数据。 保护 API 需要注意三个核心领域: 身份验证 (谁正在调用?)、 授权 (可以做什么?)和 传输安全性 (连接是否受保护?

显示身份验证、授权和数据库访问的端到端请求流的插图。

安全三大支柱

支柱 所解答的问题 关键概念
身份验证 呼叫者是谁? 验证来自身份提供者的令牌
授权 他们可以做什么? 基于角色的实体权限
运输 连接是否安全? 所有流量的传输层安全(TLS)加密

选择身份验证提供程序

数据 API 生成器支持多个身份验证提供程序。 选择与您的部署方案匹配的选项:

Provider 用例 指南
未经身份验证 DAB 位于处理身份验证的可信前端之后(默认) 配置未认证提供程序
Microsoft Entra IDEntraID/AzureAD 使用Microsoft标识的生产应用 配置 Microsoft Entra 身份验证
自定义 JSON Web 令牌 (JWT) 第三方 IdP (Okta, Auth0, Keycloak) 配置自定义 JWT 身份验证
应用程序服务 在 Azure 应用服务 EasyAuth 后面运行的应用(平台标头) 配置应用服务身份验证
模拟器 本地开发和测试 配置模拟器身份验证
OBO (用户委托) 需要实际用户标识的 SQL 数据库(行级别安全性、审核) 配置 OBO 身份验证

注释

本部分介绍的数据 API 生成器功能在版本 2.0 及更高版本中提供。 有关详细信息,请参阅 版本 2.0 中的新增功能。

身份验证

身份验证会验证调用方的身份。 数据 API 生成器通过验证 JWT 持有者令牌(EntraID/AzureADCustom)或信任平台提供的标识标头(AppServiceStaticWebApps)对请求进行身份验证。 Simulator 在开发过程中跳过外部验证。

说明客户端如何使用 JWT 令牌向数据 API 生成器进行身份验证。

工作原理

  1. 对于 JWT 提供程序,客户端从身份提供商获取令牌
  2. 客户端将令牌发送到 Authorization: Bearer <token> 标头中(JWT 提供程序),或由平台注入身份标头 (EasyAuth/SWA)
  3. 数据 API 生成器验证令牌或平台标头(颁发者、受众、JWT 提供程序的签名)
  4. DAB 从令牌或标识标头中提取用户的角色

快速参考

设置 说明
runtime.host.authentication.provider 身份验证提供程序(Unauthenticated、、EntraID/AzureADCustomAppService、) StaticWebAppsSimulator
runtime.host.authentication.jwt.audience JWT 提供程序所需的 audience 声明(AppService/StaticWebApps/Simulator/Unauthenticated 不使用)
runtime.host.authentication.jwt.issuer JWT 提供程序所需的 issuer/authority(AppService/StaticWebApps/Simulator/Unauthenticated 不使用)

有关提供程序特定的配置,请参阅本节中的身份验证指南。

授权

授权决定经过身份验证的(或匿名)用户可以执行的操作。 数据 API 生成器使用基于角色的访问控制(RBAC)来限制对实体和作的访问。

说明数据 API 生成器如何选择角色并评估请求的权限。

工作原理

  1. DAB 根据令牌和标头为请求分配一个角色
  2. DAB 查询该角色对应的实体权限
  3. 如果角色具有请求操作的权限,DAB 将执行查询
  4. 否则,DAB 返回一个403 Forbidden 响应。

系统角色与用户角色

角色类型 说明
Anonymous 当不存在经过身份验证的身份时分配
Authenticated 当请求经过身份验证(接受 JWT 或可信平台标头)且未选择特定用户角色时分配
用户角色 来自令牌的 roles 声明中的自定义角色(或平台角色),通过 X-MS-API-ROLE 标头选择

默认安全

默认情况下,实体没有权限。 必须显式授予访问权限:

{
  "entities": {
    "Book": {
      "permissions": [
        { "role": "authenticated", "actions": ["read"] }
      ]
    }
  }
}

有关详细配置,请参阅 授权概述

行级与字段级安全性

在实体级别权限控制基础上实现细粒度访问控制:

功能 说明 指南
数据库策略(行级别安全性) 将策略表达式转换为查询谓词,根据声明或会话上下文过滤行 实现行级别安全性
字段级安全性 根据各个角色,包括或排除特定列 字段访问
代表 (OBO) 将传入的用户令牌交换为下游处理的 SQL 令牌,以便数据库能够以原调用用户的身份进行身份验证(仅适用于 mssql) 用户委托的身份验证

角色继承

DAB 2.0 引入了实体权限的角色继承。 继承链为 named-role → authenticated → anonymous. 如果未为实体显式配置角色,则从下一个更广泛的角色继承。 在anonymous上定义一次权限,每个更高级的角色都获得相同的访问权限。 有关详细信息,请参阅 角色继承

传输和配置安全性

运输安全

  • 对所有连接使用 TLS:加密客户端和 DAB 之间的流量
  • 禁用旧版 TLS:仅依赖于 TLS 1.2+
  • 使用 HTTPS 端点:在生产环境中切勿通过未加密的 HTTP 暴露 DAB

有关详细信息,请参阅 安全最佳做法

配置安全性

  • 将机密存储在环境变量中:在 @env('SECRET_NAME') 配置中使用
  • 使用 Azure 密钥保管库:使用 @azure('key-vault-uri') 引用密钥
  • 机密信息绝不提交:确保 dab-config.json 中不含有密码和连接字符串
{
  "data-source": {
    "connection-string": "@env('SQL_CONNECTION_STRING')"
  }
}

监视和更新

  • 监视访问:使用 Application Insights 跟踪请求并检测异常
  • 查看日志:检查失败的身份验证尝试和权限拒绝
  • 使 DAB 保持更新:通过升级到最新版本来应用安全修补程序

快速入门指南

任务 指南
在 DAB 中使用不带 JWT 验证的受信任前端 配置未认证提供程序
设置 Microsoft Entra ID 身份验证 配置 Microsoft Entra 身份验证
使用 Okta 或 Auth0 配置自定义 JWT 身份验证
在 Azure 应用服务 后端运行 配置应用服务身份验证
在本地测试权限 配置模拟器身份验证
按用户限制行 实现行级别安全性
了解角色分配 授权概述