如何用C#从Graph Explorer获取带指定Teams权限的访问令牌?
问题解答
令牌长度差异的原因
你当前用的是客户端凭证流(Client Credentials Flow)获取的应用权限令牌,而Graph Explorer里的是基于用户登录的委派权限令牌。两种令牌的受众、包含的声明内容不同,长度有差异是正常现象,无需担忧。
实现Teams消息发送的步骤
要实现向Teams发送消息,需完成两项核心操作:在Azure AD中配置应用权限,以及修改代码中的作用域。
1. 在Azure AD中配置应用权限
- 登录Azure门户,找到你的应用注册
- 进入「API权限」页面,点击「添加权限」
- 选择「Microsoft Graph」→「应用权限」
- 搜索并添加以下权限:
Team.ReadBasic.AllChannel.ReadBasic.AllChannelMessage.SendChat.ReadWrite
- 点击「授予管理员同意」(应用权限必须经过管理员同意才能生效)
2. 修改C#代码
将原代码中的作用域数组替换为对应的应用权限作用域,完整代码如下:
using Microsoft.Identity.Client; using System; using System.Threading.Tasks; class Program { static async Task Main(string[] args) { string clientId = "YOUR_CLIENT_ID"; // 替换为所需的应用权限作用域 string[] scopes = new string[] { "https://graph.microsoft.com/Team.ReadBasic.All", "https://graph.microsoft.com/Channel.ReadBasic.All", "https://graph.microsoft.com/ChannelMessage.Send", "https://graph.microsoft.com/Chat.ReadWrite" }; string tenantId = "YOUR_TENANT_ID"; string clientSecret = "YOUR_CLIENT_SECRET"; IConfidentialClientApplication app = ConfidentialClientApplicationBuilder.Create(clientId) .WithClientSecret(clientSecret) .WithAuthority(new Uri($"https://login.microsoftonline.com/{tenantId}")) .Build(); AuthenticationResult result = await app.AcquireTokenForClient(scopes) .ExecuteAsync(); string accessToken = result.AccessToken; Console.WriteLine($"Access token: {accessToken}"); } }
注意事项
- 客户端凭证流仅适用于应用权限,无法使用依赖用户上下文的委派权限
- 必须确保应用权限已获得管理员同意,否则会返回权限不足的错误
- 后续调用Microsoft Graph API发送Teams消息时,需使用此令牌完成身份验证
内容的提问来源于stack exchange,提问作者Melissa
相关产品推荐
相关产品推荐

