基于Bot Framework开发Ms Teams机器人时如何识别团队所有者?
团队所有者识别方案
首先你遇到的TeamsChannelAccount.UserRole固定返回"user"是官方文档的遗留误差,该字段目前并未实现按团队角色返回owner/member/guest的逻辑,不要依赖该字段做权限判断,可通过以下两种方案实现需求:
方案1:调用Microsoft Graph API实现(推荐,准确率最高)
这是目前官方唯一推荐的稳定方案,实现步骤如下:
- 首先在Azure门户给你的Bot注册应用申请Graph API的应用权限
TeamMember.Read.All,提交后联系租户管理员完成权限同意。 - 从Bot的对话上下文中获取当前团队ID和当前用户的AAD ID:
var teamId = turnContext.Activity.TeamsGetTeamInfo().Id; var currentUserAadId = turnContext.Activity.From.AadObjectId;
- 调用Graph接口拉取当前团队的所有者列表,和当前用户ID做匹配即可判断身份:
// 需先安装NuGet包:Microsoft.Graph、Azure.Identity var graphClient = new GraphServiceClient( new ClientSecretCredential("租户ID", "Bot客户端ID", "Bot客户端密钥"), new[] { "https://graph.microsoft.com/.default" } ); var teamOwners = await graphClient.Teams[teamId].Owners.GetAsync(); bool isTeamOwner = teamOwners.Value.Any(owner => owner.Id == currentUserAadId);
匹配成功的用户即可判定为团队所有者,你可以给这类用户返回带高权限功能的自适应卡片。
方案2:适配低权限场景的替代方案
如果无法申请Graph API权限,你可以通过Teams自带的团队安装上下文临时判断,但仅适用于团队内@机器人的场景:
你可以在机器人首次安装到团队时,监听teamMemberAdded事件,此时拿到的安装发起用户大概率为团队所有者,你可以将这类用户ID本地存储做后续匹配,该方案准确率低于Graph API,仅做应急使用。
内容的提问来源于stack exchange,提问作者Ian
相关产品推荐
相关产品推荐

