Azure Bot 在使用 ngrok 为渠道团队进行本地调试时抛出以下异常 "Failed to acquire token for client credentials."

Azure Bot When debugging locally using ngrok for channel teams throws the following exception "Failed to acquire token for client credentials."

System.AggregateException: 'Failed to acquire token for client credentials. (Parameters: Connection String: RunAs=App;AppId=bc107559-ff62-4f67-8dd4-0dce6a0fe426, Resource: https://api.botframework.com, Authority: . Exception Message: Tried to get token using Managed Service Identity. Unable to connect to the Instance Metadata Service (IMDS). Skipping request to the Managed Service Identity (MSI) token endpoint.)'

内部异常:AzureServiceTokenProviderException:参数:连接字符串:RunAs=App;AppId=bc107559-ff62-4f67-8dd4-0dce6a0fe426,资源:https://api.botframework.com,权限:。异常消息:尝试使用托管服务身份获取令牌。无法连接到实例元数据服务 (IMDS)。跳过对托管服务标识 (MSI) 令牌端点的请求。

在尝试向用户发送消息或获取用户详细信息时抛出上述异常:

  var messageText ="What can I help you with today?\nSay something like \"Book a flight from Paris to Berlin on March 22, 2020\"";
  var promptMessage = MessageFactory.Text(messageText, messageText, InputHints.ExpectingInput);
  return await stepContext.PromptAsync(nameof(TextPrompt), new PromptOptions { Prompt = promptMessage }, cancellationToken);

第3行向用户发送提示信息时抛出异常

您可以尝试以下解决方法来解决此问题:

  • 检查 Visual studio 是 运行 管理员。
  • 检查botframework.com是否列出了机器人。
  • 用户有权在 AD 中创建应用程序。

也可以尝试以下步骤:

  1. 转到 Azure 门户中的机器人。
  2. select 左侧面板上的“身份验证”菜单。
  3. select 'Accounts in any organizational directory (Any Azure AD directory - Multitenant)' 在 'Supported account types' 如下:

User-Assigned 无法在 Azure 外部测试托管身份 (UAMI) 机器人。托管身份终结点将仅响应源自 Azure 内部的请求,这可能是出于安全原因。如 Azure SDK 存储库中的 managed identity docs and in this github issue 所示。

您在本地测试的唯一选择是创建一个单独的 multi-tenant Azure Bot 资源并使用它通过 ngrok 测试您的机器人。您无需创建应用服务,只需创建机器人即可。

或者,您始终可以将机器人部署到 Azure 进行测试。