--- summary: "Microsoft Teams 机器人的证书和托管身份验证" read_when: - "使用证书或托管身份替换客户端密钥" - "使用工作负载身份在 AKS 上部署 Teams 机器人" title: "Microsoft Teams认证" sidebarTitle: "认证" --- Teams 机器人的联合身份验证,以及它如何与客户端密钥进行比较。 ## 联邦认证(证书 + 托管标识) 对于生产环境,OpenClaw 通过 `channels.msteams.authType: "federated"` 支持**联邦认证**,作为客户端密钥的替代方案。两种方法: ### 选项 A:基于证书的认证 使用通过 Entra ID 应用程序注册注册的 PEM 证书。 **设置:** 1. 生成或获取证书(包含私钥的 PEM 格式)。 2. Entra ID → 应用注册 → **证书和密码** → **证书** → 上传公钥证书。 **配置:** ```json5 { channels: { msteams: { enabled: true, appId: "", tenantId: "", authType: "federated", certificatePath: "/path/to/cert.pem", webhook: { path: "/api/messages" }, }, }, } ``` **环境变量:** - `MSTEAMS_AUTH_TYPE=federated` - `MSTEAMS_CERTIFICATE_PATH=/path/to/cert.pem` ### 选项 B:Azure 托管标识 使用 Azure 托管标识在 Azure 基础结构(AKS、应用服务、Azure VM)上进行无密码身份验证。 **工作方式:** 1. bot pod/VM 具有托管标识(系统分配或用户分配)。 2. 联邦身份凭据将托管标识链接到 Entra ID 应用注册。 3. 运行时,OpenClaw 使用 `@azure/identity` 从 Azure IMDS 端点获取令牌。 4. 该令牌会传递给 Teams SDK,用于 bot 认证。 **前置条件:** - 启用了托管标识的 Azure 基础设施(AKS 工作负载标识、App Service、VM)。 - 已在 Entra ID 应用注册上创建联邦身份凭据。 - 从pod/VM.网络访问IMDS(`169.254.169.254:80`) **配置(系统分配托管标识):** ```json5 { channels: { msteams: { enabled: true, appId: "", tenantId: "", authType: "federated", useManagedIdentity: true, webhook: { path: "/api/messages" }, }, }, } ``` **配置(用户分配托管标识):** 在上面的配置块中添加 `managedIdentityClientId: ""`。 **环境变量:** - `MSTEAMS_AUTH_TYPE=federated` - `MSTEAMS_USE_MANAGED_IDENTITY=true` - `MSTEAMS_MANAGED_IDENTITY_CLIENT_ID=`(仅用户分配时) ### AKS 工作负载标识设置 对于使用工作负载标识的 AKS 部署: 1. 在你的 AKS 集群上**启用工作负载标识**。 2. 在 Entra ID 应用注册上**创建联邦身份凭据**: ```bash az ad app federated-credential create --id --parameters '{ "name": "my-bot-workload-identity", "issuer": "", "subject": "system:serviceaccount::", "audiences": ["api://AzureADTokenExchange"] }' ``` 3. 使用应用客户端 ID 为 Kubernetes service account 添加**注解**: ```yaml apiVersion: v1 kind: ServiceAccount metadata: name: my-bot-sa annotations: azure.workload.identity/client-id: "" ``` 4. 为工作负载标识注入**为 Pod 添加标签**: ```yaml metadata: labels: azure.workload.identity/use: "true" ``` 5. **允许网络访问**到IMDS (`169.254.169.254`):如果使用NetworkPolicy,请在端口80上添加`169.254.169.254/32`的出口规则。 ### 认证类型对比 | 方法 | 配置 | 优点 | 缺点 | | -------------------- | ---------------------------------------------- | ---------------------------------- | ------------------------------------- | | **客户端密钥** | `appPassword` | 设置简单 | 需要轮换密钥,安全性较低 | | **证书** | `authType: "federated"` + `certificatePath` | 网络中不传共享密钥 | 需要管理证书 | | **托管标识** | `authType: "federated"` + `useManagedIdentity` | 无密码,不需要管理密钥 | 需要 Azure 基础设施 | `certificateThumbprint` 可以与 `certificatePath` 一起设置,但不会被身份验证路径读取;它被接受只是为了向前兼容。 **默认值:** 当未设置 `authType` 时,OpenClaw 使用客户端密钥认证(`appPassword`)。现有配置将保持不变,继续正常工作。