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

Bot Framework Python SDK AAD认证遇Unauthorized错误求助

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 03:28:12