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

Bot Framework OAuthPrompt在模拟器中频繁返回401 Unauthorized问题求助

Bot Framework OAuthPrompt在模拟器中频繁返回401 Unauthorized问题求助

我用Bot Framework写了一个C#机器人,实现逻辑基本和微软的Teams身份验证示例一致,但在Bot Framework模拟器里测试OAuthPrompt对话框时遇到了大麻烦:

执行await stepContext.BeginDialogAsync(nameof(OAuthPrompt), null, ct);时,极少能成功弹出登录提示,大部分时候直接返回401未授权错误,偶尔还会返回404,完全是随机的。但在Azure环境里测试的话,这个连接是正常工作的。

调试OAuthPrompt的代码时,我发现问题出在调用这个API的时候:

https://api.botframework.com/api/usertoken/GetToken?userId={UserId}&connectionName={ConnectionName}&channelId=emulator

请求里携带的Bearer Token受众是https://api.botframework.com,按理说应该没问题,但这个API几乎总是返回401,偶尔404,毫无规律可言。

我的应用注册里配置的重定向URI是https://europe.token.botframework.com/.auth/web/redirect,这个是按照要求来的,应该没毛病。

另外还有一个头疼的情况:如果按照某文档配置appsettings.json,机器人直接完全无法工作——所有请求都返回401,不只是OAuthPrompt相关的。调试后发现是JWT令牌验证的问题:我的令牌颁发者是https://sts.windows.net/{tenantId}/,但代码里却在检查一个硬编码的颁发者列表:

var toBotFromEmulatorTokenValidationParameters = new TokenValidationParameters() {
    ValidateIssuer = true,
    ValidIssuers = new[] { ... }, // 这里是一堆硬编码的URL,没法完整贴出来
    ValidateAudience = false,
    ValidateLifetime = true,
    ClockSkew = TimeSpan.FromMinutes(5),
    RequireSignedTokens = true,
};

补充一些细节:我的机器人和应用注册都是单租户,注册在西欧区域。我在GitHub的issue里看到,欧洲区域的机器人可能需要验证颁发机构,于是手动把相关URL添加到了合法颁发者列表里,解决了无效颁发者的异常,但现在又抛出了新的异常:

Application with identifier '{my_app}' was not found in the directory 'Bot Framework'

如果我把应用注册从单租户切到多租户再切回单租户,异常又变成了:

is not configured for use in tenant (tenantId:d6d49420-f39b-4df7-a1dc-d59a935871db)

要是把应用注册改成多租户,颁发机构验证能通过,但OAuthPrompt还是会返回401。而且调用GetToken API时的令牌颁发者依然是https://sts.windows.net/{tenantId}/。

最后我试了个临时办法:新建了一个全局区域的机器人,居然一切正常,但这终究只是个 workaround,不是解决原问题的根本办法。

现在我完全不知道从哪里开始排查,没有任何明确的错误线索能指向问题所在,有没有大神能指点一下?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 12:38:02