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

如何验证Microsoft Teams MessageCard HttpPost发送的Azure AD JWT令牌

用Azure AD验证Teams MessageCard请求中的JWT令牌流程

我给你梳理完整的实操步骤,从令牌验证到后续业务逻辑落地:

一、先把JWT的合法性验证做扎实

别自己手动解析签名,直接用Azure AD官方的验证工具库,不同语言对应不同库:

  • .NET用Microsoft.Identity.Web,Java用MSAL,Python用pyjwt配合Azure AD公钥
  • 核心要验证这几个点:
    • 签名有效性:从Azure AD的OIDC元数据端点(比如https://login.microsoftonline.com/{你的租户ID}/v2.0/.well-known/openid-configuration)拿公钥来验
    • 发行方(iss)必须是你的Azure AD租户
    • 受众(aud)要和你的服务在Azure AD里注册的客户端ID匹配,确保令牌是发给你的服务的
    • 令牌没过期(检查exp时间戳)

二、提取用户对象ID

JWT里的oid声明就是Azure AD用户的对象ID,直接取就行:

  • .NET里用User.FindFirst("oid")?.Value
  • Python解码JWT后直接取payload["oid"]

三、拿到对象ID后的后续操作

1. 权限校验

如果你的服务需要控制谁能发卡片,把这个对象ID和你预先配置的权限名单比对:

  • 比如存在Azure AD的应用角色里,或者你的业务数据库的权限表中,判断该用户有没有发送权限

2. 关联业务数据

用对象ID绑定用户业务信息:

  • 可以调用Microsoft Graph API拿用户的邮箱、部门等详细信息,或者直接用对象ID作为标识关联你的业务数据

3. 日志审计

把对象ID记录到操作日志里,方便后续审计和排查问题

示例代码(.NET 用Microsoft.Identity.Web)

// 先在Program.cs里配置Azure AD认证
builder.Services.AddMicrosoftIdentityWebApiAuthentication(builder.Configuration);

// 接口里处理请求
[Authorize]
[HttpPost("send-teams-card")]
public IActionResult SendTeamsCard([FromBody] TeamsCardRequest request)
{
    // 提取用户对象ID
    string userId = User.FindFirst("oid")?.Value;
    
    // 权限校验示例:从数据库查该用户是否有权限
    if (!_permissionService.IsUserAllowed(userId))
    {
        return Forbid("没权限发这个卡片");
    }
    
    // 执行发送MessageCard的逻辑
    _teamsService.SendCardToChannel(request, userId);
    
    return Ok();
}

注意事项

  • 你的服务必须在Azure AD里注册成API,配置好正确的受众(aud)
  • 如果是跨租户场景,把租户ID改成common或者指定允许的租户列表
  • 所有验证逻辑必须在服务端做,绝对不能放客户端处理,避免安全漏洞

附JWT声明截图(包含oid字段)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 10:33:21