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

C#控制台应用向Azure托管Skype Bot发消息遇未授权错误求助

排查C#控制台向Skype Bot发消息的Unauthorized错误

既然你已经确认了Web.Config里的凭据无误,那咱们从几个客户端侧容易忽略的方向入手排查:

1. 先搞清楚:客户端和Bot服务端的认证逻辑不一样

Web.Config里的MicrosoftAppId和MicrosoftAppPassword是给Bot服务端自身做身份验证用的,控制台作为客户端向Bot发消息,不能直接用这些凭据,得走对应的API认证流程:

  • 如果用Direct Line API(推荐的Bot通信方式):
    你需要先到Azure门户的Bot资源里,进入「Channels」→「Direct Line」,生成一个专属的Direct Line密钥(主/副密钥都可以)。然后在控制台里用这个密钥请求会话令牌:
    using System.Net.Http;
    using System.Net.Http.Headers;
    using System.Threading.Tasks;
    
    var client = new HttpClient();
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "你的Direct Line主密钥");
    var response = await client.PostAsync("https://directline.botframework.com/v3/directline/tokens/generate", null);
    var sessionToken = await response.Content.ReadAsStringAsync();
    
    之后用这个会话令牌创建Direct Line会话,再发送消息——之前如果误用Azure AD的AppId/密码来请求Direct Line,必然会返回未授权。

2. 检查Skype频道的配置状态

  • 确认你的Bot已经正确启用Skype频道:在Azure Bot资源的「Channels」页面,Skype频道必须是「已启用」状态,且完成了Skype关联的权限同意流程
  • 刚配置的Skype频道可能有几分钟的生效延迟,如果你是刚设置完就测试,不妨等一会儿再试。

3. 若用Graph API发消息:检查Azure AD应用的权限

如果你的代码是直接调用Microsoft Graph API发送Skype消息,得确保:

  • 你的MicrosoftAppId对应的Azure AD应用注册,已经添加了应用权限(不是委派权限)里的ChatMessage.Send或SkypeForBusiness.SendMessage等相关权限,并且完成了管理员同意
  • 获取令牌时要用客户端凭据流,请求范围设为https://graph.microsoft.com/.default,示例代码:
    using Microsoft.Identity.Client;
    
    var app = ConfidentialClientApplicationBuilder
        .Create("你的MicrosoftAppId")
        .WithClientSecret("你的MicrosoftAppPassword")
        .WithAuthority(new Uri("https://login.microsoftonline.com/你的租户ID"))
        .Build();
    
    var tokenResult = await app.AcquireTokenForClient(new[] { "https://graph.microsoft.com/.default" })
        .ExecuteAsync();
    // 用tokenResult.AccessToken作为请求头的Bearer令牌调用Graph API
    
    没加对权限或者没完成管理员同意,肯定会触发未授权错误。

4. 检查代码里的请求细节

  • 确保请求头的Authorization格式是Bearer {令牌},没有拼写错误(比如把Bearer写成Bear或者漏了空格)
  • 确认API端点版本正确:Direct Line要用v3版本,Graph API优先用v1.0(beta版本可能有兼容性问题)
  • 不要直接调用Bot的消息接收端点——那个是给Bot服务端用的,客户端必须通过Direct Line或Graph API中转。

5. 验证令牌有效性

你可以用任意JWT解码工具(比如本地的解码库或离线工具)解析获取到的令牌,检查:

  • aud(受众)是否和你调用的API匹配(比如Direct Line的受众是https://directline.botframework.com)
  • exp(过期时间)是否在有效期内
  • roles或scp字段是否包含你需要的权限

内容的提问来源于stack exchange,提问作者Arno van Zyl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:25:40