💡

Microsoft Bot Framework に Azure AD 認証を追加すると例外が発生する

に公開

Microsoft Teams のカスタム アプリでは、ボットやタブなど複数の機能を持たせることができます。ボットは、いくつかの方法で作成できます。

  • Microsoft Bot Framework
  • Power Virtual Agents
  • Webhook とコネクタ

Microsoft Bot Framework (C#) の場合、テンプレートからプロジェクトを作成します。作成したコードは Azure Web Apps にデプロイし、Azure Bot Service から呼び出すことになります。このとき、タブの機能も追加する場合は、タブから呼び出すカスタム API もボットのプロジェクトにまとめたいです。カスタム API をセキュリティで保護するために、プロジェクト構成に AddMicrosoftIdentityWebApiAuthentication を追加します。これで問題なく動作するように見えますが、ログを見るとボットの呼び出し時に例外が発生していることがわかります。

Bearer was not authenticated. Failure message: IDX40003: Neither tid nor tenantId claim is present in the token obtained from Microsoft identity platform. 

Azure Bot Service から Azure Web Apps を呼び出す際は、Azure Bot Service の作成時に指定した Azure AD アプリケーションで認証が行われます。Bearer を抜き出してみると、以下のような内容です。

{
  "serviceurl": "https://webchat.botframework.com/",
  "nbf": 168...,
  "exp": 168...,
  "iss": "https://api.botframework.com",
  "aud": "dd7..."
}

AddMicrosoftIdentityWebApiAuthentication の呼び出しによって tid を検証しようとしますが、そのようなクレームは存在しないため例外が発生します。解決するには、自前で Middleware を構成するか、Azure Web Apps を分割する必要があります。Windows 環境限定ですが、仮想アプリケーションをわけることで、1 つの Azure Web Apps に複数の Web アプリケーションを配置する方法もあります。ボット自体は動作しているため、例外を無視するという選択肢もありますが、これは最終手段といえます。

Discussion