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

