Skip to content

配置 MCP 身份验证

MCP 服务涉及两条身份链路:入站——MCP 客户端如何向数据墙DBW 证明身份;出站——数据墙DBW 以什么身份连接数据库。两条链路独立配置。

出站:数据库连接身份

出站连接使用 data-source 中的连接字符串,与 REST 和 GraphQL 完全一致。推荐通过环境变量传入:

json
{
  "data-source": {
    "database-type": "mssql",
    "connection-string": "@env('SQL_CONNECTION_STRING')"
  }
}

环境变量值示例:

text
Server=host;Database=db;User ID=app-user;Password=pwd;Encrypt=True;TrustServerCertificate=True;

MCP 工具执行的查询使用的是这个连接身份。数据库用户拥有的权限即 MCP 代理可执行操作的上限。

入站:MCP 客户端认证

入站认证控制 MCP 客户端如何向服务端证明身份,有三种模式。

匿名模式(Unauthenticated)

默认配置,服务不做身份验证。所有 MCP 请求按 anonymous 角色处理:

json
{
  "runtime": {
    "host": {
      "authentication": {
        "provider": "Unauthenticated"
      }
    }
  }
}

适用场景:

  • 本地开发和测试。
  • 服务位于可信网关之后,网关已完成认证。
  • 内网环境,不面向外部用户。

IMPORTANT

匿名模式下,需要在实体的 permissions 中显式配置 anonymous 角色的操作权限。否则所有 MCP 请求会被拒绝。

JWT 模式(Custom)

MCP 客户端在请求中携带 Bearer Token,服务验证令牌的 issuer、audience 和签名:

json
{
  "runtime": {
    "host": {
      "authentication": {
        "provider": "Custom",
        "jwt": {
          "audience": "api://dab-api",
          "issuer": "https://identity.example.com/"
        }
      }
    }
  }
}

适用场景:

  • MCP 客户端能够发送 Bearer Token。
  • 对接第三方身份系统(Okta、Auth0、Keycloak)。
  • 需要根据用户角色区分 MCP 访问权限。

令牌验证通过后,引擎从 roles 声明提取用户角色。客户端可通过 X-MS-API-ROLE 头指定本次请求使用的角色。

网关模式

在数据墙DBW 前放置 API 网关或反向代理(Nginx、Traefik 等),由网关完成认证后转发请求:

text
MCP 客户端 → 网关(认证) → 数据墙DBW /mcp

数据墙DBW 配置为匿名模式,网关负责身份验证并将角色信息注入请求头。这种模式下,认证逻辑从数据墙DBW 中解耦出去,由基础设施统一管理。

Stdio 模式的身份验证

Stdio 模式下,无论配置文件如何设置,认证提供程序都会被自动覆盖为 Simulator:

身份验证提供程序 → Simulator(强制覆盖)

Simulator 模式下所有请求按指定角色处理,不验证令牌。角色通过启动参数指定:

bash
dab start --mcp-stdio role:editor

省略时默认为 anonymous。Stdio 模式仅用于本地开发,不应在生产环境使用。

Stdio 模式内部行为

行为说明
UTF-8 无 BOM控制台输入输出强制为不带 BOM 的 UTF-8 编码
Simulator 认证自动将认证提供程序覆盖为 Simulator
无 HTTP 监听不绑定任何 TCP 端口
请求大小限制传入请求限制为 1 MB

启动期间以下配置键会被内存覆盖:

MCP:StdioMode"true"
MCP:Role"<role-name>""anonymous"
Runtime:Host:Authentication:Provider"Simulator"

MCP 角色的权限规划

为 MCP 代理创建专用的受限角色是推荐做法:

json
{
  "entities": {
    "Product": {
      "permissions": [
        { "role": "mcp-agent", "actions": ["read"] }
      ]
    },
    "Order": {
      "permissions": [
        { "role": "mcp-agent", "actions": ["read", "create"] }
      ]
    }
  }
}
建议说明
不给写入和删除权限除非业务明确需要 AI 代理修改数据
排除敏感字段通过 fields.exclude 对 MCP 代理角色隐藏敏感列
限制行级数据通过数据库策略限制 MCP 代理仅可见必要数据行
审计日志为 MCP 代理专用角色启用日志,追踪代理行为

下一步

数据墙DBW 产品文档与开发指南。