You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Microsoft Teams:跨租户场景下如何识别租户及实现应用上下文共享?

跨租户场景下Microsoft Teams标签页与机器人应用的租户上下文处理

一、核心逻辑:靠Teams自带的租户标识搞定区分与上下文复用

Teams在不同租户里运行时,每个请求都会携带租户ID(tid),这是区分租户的核心依据。标签页和机器人交互时得始终传递并验证这个标识,确保上下文一致。

二、机器人怎么区分不同租户

机器人的API接口要接收并验证租户ID,同时把所有租户相关的数据(成员列表、通知记录等)按租户ID隔离存储:

  • 接口参数要求:GET /api/members.json和POST /api/notifications.json必须让标签页请求带上tenantId(可放在查询参数或请求头中)
  • 数据隔离:数据库表新增tenant_id字段,所有查询、写入操作都用这个字段做过滤条件
  • 权限校验:调用Teams Graph API获取成员列表时,必须带上租户ID,确保机器人在当前租户拥有操作权限

以下是C#后端的代码示例:

[HttpGet("api/members.json")]
public async Task<IActionResult> GetMembers([FromQuery] string tenantId, [FromHeader] string authorization)
{
    // 验证租户ID与令牌是否匹配
    if (!await ValidateTenantAccess(tenantId, authorization))
    {
        return Unauthorized("租户访问无效");
    }
    // 按租户ID查询成员列表
    var members = await _memberRepository.GetAllByTenantId(tenantId);
    return Ok(members);
}

private async Task<bool> ValidateTenantAccess(string tenantId, string authToken)
{
    // 解析令牌中的租户ID,与传入的租户ID比对
    var tokenHandler = new JwtSecurityTokenHandler();
    var jwtToken = tokenHandler.ReadJwtToken(authToken.Replace("Bearer ", ""));
    var tokenTenantId = jwtToken.Claims.First(c => c.Type == "tid").Value;
    return tokenTenantId == tenantId;
}

三、标签页调用机器人API时怎么复用租户上下文

标签页在个人模式下运行时,直接从Teams SDK获取当前租户ID和用户令牌,调用API时一并传递:

  • 获取租户ID:通过microsoftTeams.getContext()方法获取tenant.id
  • 获取用户令牌:通过microsoftTeams.authentication.getAuthToken()获取,该令牌自带tid声明
  • 调用API:将tenantId放在查询参数或请求头中,同时携带令牌作为授权凭据

以下是前端JavaScript示例:

// 获取Teams上下文
microsoftTeams.getContext(async (context) => {
    const tenantId = context.tenant.id;
    // 获取当前用户的访问令牌
    const authToken = await microsoftTeams.authentication.getAuthToken({
        resources: ["https://你的机器人API域名.com"]
    });
    // 调用机器人API获取成员列表
    const membersResponse = await fetch(`https://你的机器人API域名.com/api/members.json?tenantId=${tenantId}`, {
        headers: {
            "Authorization": `Bearer ${authToken}`
        }
    });
    const members = await membersResponse.json();
    
    // 调用机器人API发送通知
    await fetch(`https://你的机器人API域名.com/api/notifications.json?tenantId=${tenantId}`, {
        method: "POST",
        headers: {
            "Authorization": `Bearer ${authToken}`,
            "Content-Type": "application/json"
        },
        body: JSON.stringify({
            members: members,
            notificationContent: "第三方资源通知内容"
        })
    });
});

四、需要注意的关键点

  • 应用权限配置:在Azure AD应用注册中,将“账户类型”设置为“任何组织目录中的账户”,确保应用支持跨租户运行
  • 令牌严格验证:机器人端必须校验令牌的有效性,包括租户ID匹配、令牌未过期、权限范围正确
  • 数据严格隔离:所有租户相关的业务数据必须按租户ID单独存储,避免跨租户数据泄露

内容的提问来源于stack exchange,提问作者smtlaissezfaire

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 11:27:18