Bot Framework Python SDK AAD认证遇Unauthorized错误求助
已完成的配置操作
- 克隆Python版Bot认证示例项目
- 按官方文档完成配置:
- 创建MultiTenant类型Bot资源(确认Python Bot不支持UserAssignedMSI,SingleTenant模式无法运行),配置的OAuth连接(AAD及AAD v2均测试验证可用)
- 完成应用注册,配置对应API权限与重定向URI
- 直接调用应用注册接口可正常返回200响应及access token
问题现象
- 在VS Code的Python 3.11虚拟环境中启动Bot,通过Bot模拟器打开并提供App ID和客户端密钥,执行认证逻辑时控制台抛出Unauthorized错误,错误栈如下:
[on_turn_error] unhandled error: Operation returned an invalid status code 'Unauthorized' Traceback (most recent call last): File "working_dir\.venv\Lib\site-packages\botbuilder\core\bot_adapter.py", line 174, in run_pipeline return await self._middleware.receive_activity_with_status( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "working_dir\.venv\Lib\site-packages\botbuilder\core\middleware_set.py", line 69, in receive_activity_with_status return await self.receive_activity_internal(context, callback) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "working_dir\.venv\Lib\site-packages\botbuilder\core\middleware_set.py", line 79, in receive_activity_internal return await callback(context) ^^^^^^^^^^^^^^^^^^^^^^^ File "working_dir\bot\bots\dialog_bot.py", line 31, in on_turn await super().on_turn(turn_context) File "working_dir\.venv\Lib\site-packages\botbuilder\core\activity_handler.py", line 70, in on_turn await self.on_message_activity(turn_context) File "working_dir\bot\bots\dialog_bot.py", line 38, in on_message_activity await DialogHelper.run_dialog( File "working_dir\bot\helpers\dialog_helper.py", line 16, in run_dialog await dialog_context.begin_dialog(dialog.id) File "working_dir\.venv\Lib\site-packages\botbuilder\dialogs\dialog_context.py", line 121, in begin_dialog return await dialog.begin_dialog(self, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "working_dir\.venv\Lib\site-packages\botbuilder\dialogs\component_dialog.py", line 67, in begin_dialog turn_result = await self.on_begin_dialog(inner_dc, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "working_dir\bot\dialogs\logout_dialog.py", line 21, in on_begin_dialog return await super().on_begin_dialog(inner_dc, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "working_dir\.venv\Lib\site-packages\botbuilder\dialogs\component_dialog.py", line 221, in on_begin_dialog return await inner_dc.begin_dialog(self.initial_dialog_id, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "working_dir\.venv\Lib\site-packages\botbuilder\dialogs\dialog_context.py", line 121, in begin_dialog return await dialog.begin_dialog(self, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "working_dir\.venv\Lib\site-packages\botbuilder\dialogs\waterfall_dialog.py", line 64, in begin_dialog return await self.run_step(dialog_context, 0, DialogReason.BeginCalled, None) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "working_dir\.venv\Lib\site-packages\botbuilder\dialogs\waterfall_dialog.py", line 154, in run_step return await self.on_step(step_context) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "working_dir\.venv\Lib\site-packages\botbuilder\dialogs\waterfall_dialog.py", line 130, in on_step return await self._steps[step_context.index](step_context) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "working_dir\bot\dialogs\main_dialog.py", line 51, in prompt_step return await step_context.begin_dialog(OAuthPrompt.__name__) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "working_dir\.venv\Lib\site-packages\botbuilder\dialogs\dialog_context.py", line 121, in begin_dialog return await dialog.begin_dialog(self, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "working_dir\.venv\Lib\site-packages\botbuilder\dialogs\prompts\oauth_prompt.py", line 168, in begin_dialog output = await _UserTokenAccess.get_user_token( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "working_dir\.venv\Lib\site-packages\botbuilder\dialogs\_user_token_access.py", line 27, in get_user_token return await user_token_client.get_user_token( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "working_dir\.venv\Lib\site-packages\botframework\connector\auth\_user_token_client_impl.py", line 44, in get_user_token result = await self._client.user_token.get_token( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "working_dir\.venv\Lib\site-packages\botframework\connector\token_api\aio\operations_async\_user_token_operations_async.py", line 100, in get_token raise models.ErrorResponseException(self._deserialize, response) botframework.connector.token_api.models._models_py3.ErrorResponseException: Operation returned an invalid status code 'Unauthorized' Datetime with no tzinfo will be considered UTC.
- 通过Bot模拟器尝试登录时,登录对话框未显示就收到Unauthorized响应
疑问
本人在客户租户中拥有Contributor角色,所有资源均自行创建,资源配置看似正确但仍报错,是否需要管理员授权?还有哪些配置环节可能遗漏?
内容的提问来源于stack exchange,提问作者chris_to
相关产品推荐
相关产品推荐

