如何验证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时间戳)
- 签名有效性:从Azure AD的OIDC元数据端点(比如
二、提取用户对象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
相关产品推荐
相关产品推荐

