ボットに認証を追加する

この記事の対象: SDK v4

Azure AI Bot Service v4 SDK を使用すると、ユーザー認証を必要とするオンライン リソースにアクセス可能なボットの開発が容易になります。 Azure が OAuth 2.0 を使用して各ユーザー資格情報に基づいてトークンを生成するため、ボットが認証トークンを管理する必要はありません。 ボットでは、Azure によって生成されたトークンを使用して、それらのリソースにアクセスします。 この方法では、ユーザーはセキュリティで保護されたリソースにアクセスするための ID とパスワードをボットに提供する必要はありません。信頼できる ID プロバイダーにのみ提供します。

Bot Framework でのこの種類の認証を処理する方法の概要については、「ユーザー認証」を参照してください。

この記事では、2 つのサンプルを参照します。 1 つは、認証トークンを取得する方法を示しています。 もう 1 つはより複雑で、ユーザーに代わって Microsoft Graph にアクセスする方法を示しています。 どちらの場合も、ID プロバイダーとして Azure AD v1 または v2 を使用して、ボットの OAuth トークンを取得できます。 この記事では、次の方法について説明します。

  • Azure Bot リソースを作成する
  • Microsoft Entra ID ID プロバイダーを作成する
  • Microsoft Entra ID ID プロバイダーをボットに登録する
  • ボット コードを準備する

この記事を完了すると、いくつかの単純なタスクに応答できるボットが完成します。 Microsoft Graph の例では、メールの送信、自分の情報の表示、最新のメールの確認を行えます。 OAuth の機能をテストするためにボットを公開する必要はありませんが、ボットには有効な Azure アプリ ID とパスワードが必要になります。

Note

Bot Framework JavaScript SDK、C#、Python SDK は引き続きサポートされますが、Java SDK については、最終的な長期サポートは 2023 年 11 月に終了する予定です。 このリポジトリ内の重要なセキュリティとバグの修正のみが行われます。

Java SDK を使用して構築された既存のボットは引き続き機能します。

新しいボットの構築については、Power Virtual Agents の使用を検討し、適切なチャットボット ソリューションの選択についてお読みください。

詳細については、「The future of bot building」をご覧ください。

Web チャットと Direct Line に関する考慮事項

重要

Web チャット コントロールを使用してボットに接続するときのセキュリティ リスクを軽減するには、強化された認証を有効にした Direct Line を使用する必要があります。 詳細については、「Direct Line 拡張認証」を参照してください。

前提条件

  • ボットの基本状態の管理ダイアログ ライブラリ連続して行われる会話フローを実装する方法、ダイアログを再利用する方法に関する知識。

  • Azure と OAuth 2.0 開発の知識。

  • .NET 用の Visual Studio 2017 以降。

  • Javascript 用の Node.js。

  • Python 用 Python 3.8 以降

  • 次に示すサンプルのいずれか。

    サンプル BotBuilder のバージョン 説明
    C#JavaScriptJavaPython での認証 v4 OAuthCard サポート
    C#JavaScriptJava、または Python での Microsoft Graph の認証 v4 OAuth 2.0 を使用した Microsoft Graph API サポート
    C#JavaScriptJava、または Python での Microsoft Teams の認証 v4 OAuth 2.0 を使用した Microsoft Graph API サポート

    この記事で参照しているサンプルを実行するには、次のものが必要です。

    • Azure にボット リソースを登録するための Microsoft Entra ID アプリケーション。 このアプリケーションを使用すると、ボットはMicrosoft Graph などのセキュリティで保護された外部リソースにアクセスできます。 また、ユーザーは Web チャットなどの複数のチャネルを介してボットと通信できます。
    • ID プロバイダーとして機能する別の Microsoft Entra ID アプリケーション。 このアプリケーションは、ボットとセキュリティで保護されたリソースの間で OAuth 接続を確立するために必要な資格情報を提供します。 この記事では、ID プロバイダーとして Active Directory を使用することに注意してください。 他にも多くのプロバイダーがサポートされています。

重要

Azure でボットを登録すると必ず、Microsoft Entra ID アプリケーションが割り当てられますが、 このアプリケーションで保護されるのは、チャネルからボットへのアクセスです。 ユーザーに代わってボットがアクセスする外部のセキュリティで保護されたリソースごとに、別の Microsoft Entra ID アプリケーションが必要です。

リソースを作成する

Azure Bot リソースを作成します。これにより、ボットを Azure AI Bot Service に登録できます。

ヒント

新しい Web アプリ ボットボット チャンネル登録リソースは作成できませんが、構成および配置された既存のリソースは引き続き機能します。 SDK バージョン 4.14.1.2 以降の VSIX または Yeoman テンプレートから作成されたボットには、Azure Bot リソースを生成する ARM テンプレートが含まれています。

  1. Azure ポータルにアクセスします。

  2. 右側のウィンドウで、 [リソースの作成] を選びます。

  3. 検索ボックスに「bot」と入力し、Enter キーを押します。

  4. Azure Bot カードを選択します。

    Select Azure bot resource

  5. [作成] を選択します

  6. 必須フィールドに値を入力し、設定の確認と更新を行います。

    1. [プロジェクトの詳細] に情報を入力します。 ボットにグローバル データ所在地とローカル データ所在地のどちらを使用するかを選択します。 現在、ローカル データ所在地機能は、「westeurope」および「centralindia」リージョンのリソースで使用できます。 詳細については、「Azure AI Bot Service での登録」を参照してください。

      The project details settings for an Azure Bot resource

    2. [Microsoft アプリ ID] に情報を入力します。 Azure でボット ID を管理する方法と、新しい ID を作成するか、既存の ID を使用するかを選択します。

      The Microsoft app ID settings for an Azure Bot resource

  7. [Review + create](レビュー + 作成) を選択します。

  8. 検証テストに合格したら、[作成] を選びます。

  9. デプロイが完了したら、[リソースに移動] を選択します。 選択したリソース グループにボットと関連リソースが一覧表示されます。

  10. Bot Framework SDK をまだお持ちでない場合は、[GitHub からダウンロード] を選択して、優先する言語のパッケージを使用する方法を確認してください。

    Create bot in SDK

これで、Bot Framework SDK を使用してボットを構築する準備ができました。

ヒント

Azure が新しいアプリ ID を使用して、新しいシングルテナントまたはマルチテナントの Azure Bot リソースを作成すると、パスワードも生成されます。

ボット ID 情報

次の手順に従って、ボットの構成ファイルに ID 情報を追加します。 ファイルは、ボットの作成に使用するプログラミング言語によって異なります。

重要

Java バージョンと Python バージョンの Bot Framework SDK では、マルチテナント ボットのみがサポートされます。 C# バージョンと JavaScript バージョンでは、ボットの ID を管理するための 3 種類のアプリケーションがすべてサポートされています。

Language ファイル名 メモ
C# appsettings.json ボットの ID を管理するための 3 種類のアプリケーションがすべてサポートされています。
JavaScript .env ボットの ID を管理するための 3 種類のアプリケーションがすべてサポートされています。
Java アプリケーション プロパティ: マルチテナント ボットのみをサポートします。
Python config.py マルチテナント ボットのみをサポートします。 os.environ.get メソッド呼び出しの引数として ID プロパティを提供します。

追加する必要がある ID 情報は、ボットのアプリケーション タイプによって異なります。 構成ファイルで次の値を提供します。

Java と C# ボットでのみ使用できます。

プロパティ
MicrosoftAppType UserAssignedMSI
MicrosoftAppId ユーザー割り当てマネージド ID のクライアント ID
MicrosoftAppPassword 該当なし。 ユーザー割り当てマネージド ID ボットの場合は、この値を空白のままにします。
MicrosoftAppTenantId ユーザー割り当てマネージド ID のテナント ID。

App Service を更新するには

ボットの既存の App Service リソース (Web アプリ) があり、ボットが ユーザー割り当てマネージド ID アプリケーションである場合は、ボットの App Service を更新する必要がある場合があります。

  1. ボットの Web アプリの App Service ブレードに移動します。
  2. [設定] にある [ID] を選択します。
  3. [ID] ブレードで [ユーザー割り当て] タブを選択し、[追加] (+) を選択します。
  4. ユーザー割り当てマネージド ID の追加 ブレード上:
    1. サブスクリプションを選択します。

    2. ユーザー割り当てマネージド ID の場合 は、ボットのマネージド ID を選択します。 マネージド ID が自動的に生成された場合は、ボットと同じ名前になります。

    3. ボットにこの ID を使用するには、[追加] を選択します。

      The App Service Identity blade with the managed identity for the bot selected.

アプリまたはテナント ID を取得するには

ボットのアプリまたはテナント ID を取得するには:

  1. ボットの [Azure Bot リソース] ブレードに移動します。
  2. ボットの [構成] ブレードに移動します。 このブレードから、ボットの Microsoft アプリ ID またはアプリ テナント ID をコピーできます。

新しいパスワードを生成するには

シングルテナント ボットとマルチテナント ボットには、一部の操作に必要となるアプリ シークレットまたはパスワードがあります。 Azure AI Bot Service では、ボット シークレットが非表示になります。 ただし、ボットの App Service リソースの所有者は、新しいパスワードを生成できます。

  1. ボットの [Azure Bot リソース] ブレードに移動します。
  2. ボットの [構成] ブレードに移動します。
  3. [Microsoft アプリ ID] の横にある [管理] を選択して、App Service の [証明書 + シークレット] ブレードに移動します。
  4. ブレードの指示に従って新しいクライアント シークレットを作成し、安全な場所に値を記録します。

Microsoft Entra ID ID サービス

Microsoft Entra ID は、OAuth 2.0 などの業界標準プロトコルを使用して、ユーザーを安全にサインインさせるアプリケーションをビルドすることができるクラウド ID サービスです。

次の 2 つの ID サービスのいずれかを使用できます。

  1. Microsoft Entra ID 開発者プラットフォーム (v1.0)。 Azure AD v1エンドポイントとも呼ばれ、Microsoft の職場または学校アカウントを使用してユーザーを安全にサインインさせるアプリを構築できます。 詳細については、「開発者向け Microsoft Entra ID (v1.0)」を参照してください。
  2. Microsoft ID プラットフォーム (v2.0)。 Microsoft Entra ID エンドポイントとも呼ばれる、Azure AD プラットフォーム (v1.0) の進化版です。 これにより、すべての Microsoft ID プロバイダーにサインインして、Microsoft API (Microsoft Graph など) や開発者が構築した他の API を呼び出すためにトークンを取得するアプリケーションを構築できます。 詳細については、「Microsoft ID プラットフォーム (v2.0) の概要」を参照してください。

v1 と v2 エンドポイントの違いについては、「Microsoft ID プラットフォーム (v2.0) に更新する理由」を参照してください。 全情報については、「Microsoft ID プラットフォーム (旧「開発者向け Microsoft Entra ID」)」を参照してください。

Microsoft Entra ID ID プロバイダーを作成する

このセクションでは、OAuth 2.0 を使用してボットを認証する Microsoft Entra ID ID プロバイダーを作成する方法について説明します。 Azure AD v1 または Microsoft Entra ID エンドポイントを使用できます。

ヒント

アプリケーションによって要求されたアクセス許可を委任することに同意できる、テナントで Microsoft Entra ID アプリケーションを作成し、登録する必要があります。

  1. Azure portal で Microsoft Entra ID パネルを開きます。 適切なテナントにいない場合は、[ディレクトリの切り替え] を選択して適切なテナントに切り替えます。 (テナントを作成する方法については、「ポータルへのアクセスとテナントの作成」を参照してください。)

  2. [アプリの登録] パネルを開きます。

  3. [アプリの登録] パネルで、[新規登録] を選択します。

  4. 必須のフィールドに入力してアプリ登録を作成します。

    1. アプリケーションに名前を付けます。

    2. ご自分のアプリケーションについて、[サポートされているアカウントの種類] を選択します。 (このサンプルは、これらのオプションのどれを使用しても動作します。)

    3. [リダイレクト URI][ウェブ] を選択し、サポートされている OAuth リダイレクト URL のいずれかに URL を設定します。

    4. 登録 を選択します。

      • アプリが作成された後、そのアプリの [概要] ページが Azure に表示されます。
      • [アプリケーション (クライアント) ID] の値を記録します。 この値は、後で接続文字列を作成し、Microsoft Entra ID プロバイダーをボット登録に登録するときにクライアント ID として使用します。
      • [ディレクトリ (テナント) ID] の値を記録します。 この値は、このアプリケーションを自分のボットに登録する際に使用します。
  5. ナビゲーション ウィンドウで [認定資格書とシークレット] を選択して、自分のアプリケーションのシークレットを作成します。

    1. [クライアント シークレット] で、 [新しいクライアント シークレット] を選択します。
    2. 説明を追加します (bot login など)。必要に応じてこのアプリのために作成する他のシークレットからこれを識別するためです。
    3. [期限切れ] で、シークレットの有効期限が切れる期間を選択します。
    4. [追加] を選択します。
    5. [認定資格証とシークレット] を離れる前に、シークレットを記録します。 この値は、後で Microsoft Entra ID アプリケーションをご自身のボットに登録するときに、"クライアント シークレット" として使用します。
  6. ナビゲーション ウィンドウで、[API のアクセス許可] を選択し、[API のアクセス許可] パネルを開きます。 アプリの API アクセス許可を明示的に設定するのが成功事例です。

    1. [アクセス許可の追加] を選択し、[API アクセス許可の要求] ウィンドウを表示します。

    2. このサンプルでは、[Microsoft API][Microsoft Graph] を選択します。

    3. [委任されたアクセス許可] を選択し、必要とするアクセス許可が選択されていることを確認します。 このサンプルでは、これらのアクセス許可が必要です。

      Note

      [管理者の同意が必要] とマークされているアクセス許可は、ユーザーとテナント管理者の両方がログインすることを要求するため、ボットではこれらのアクセス許可を避けるのが一般的です。

      • openid
      • profile
      • Mail.Read
      • Mail.Send
      • User.Read
      • User.ReadBasic.All
    4. アクセス許可の追加 を選択します。 (ユーザーは、ボットを通じてこのアプリに初めてアクセスする際に、同意を付与する必要があります。)

これで、Microsoft Entra ID アプリケーションが構成されました。

Note

接続文字列を作成し、ID プロバイダーをボット登録に登録するときに、アプリケーション (クライアント) IDクライアント シークレットを割り当てます。 次のセクションをご覧ください。

Microsoft Entra ID ID プロバイダーをボットに登録する

次の手順では、ID プロバイダーをボットに登録します。

  1. Azure Portal でボットの Azure ボット リソース ページを開きます。

  2. 設定を選択します。

  3. ページ下部付近にある [OAuth 接続設定] で、[設定の追加] を選択します。

  4. 次のようにフォームに入力します。

    1. 名前。 接続の名前を入力します。 ボットのコードで使用します。

    2. サービス プロバイダーMicrosoft Entra ID を選択して、Microsoft Entra ID 固有のフィールドを表示します。

    3. クライアント ID。Microsoft Entra ID ID プロバイダー用に記録したアプリケーション (クライアント) ID を入力します。

    4. クライアント シークレット。 Microsoft Entra ID ID プロバイダー用に記録したシークレットを入力します。

      ヒント

      証明書を使用する場合は、証明書プロバイダーで AAD v2 を選択することができます。 ボット サービス トークン ストア (appid: 5b404cf4-a79d-4cfe-b866-24bf8e1a4921) に証明書を取得するアクセス許可を付与する必要があります。

    5. トークン交換 URL。 Microsoft Entra ID の SSO にのみ使用されるため、空白のままにします。

    6. テナント ID。 Azure AD アプリを作成したときに選択したサポートされるアカウントの種類に基づいて、Microsoft Entra ID アプリ用に前に記録した[ディレクトリ (テナント) ID] を入力するか、ディレクトリ (テナント) ID を入力するか、「common」と入力します。 割り当てる値を決定するには、次の条件に従います。

      • Microsoft Entra ID アプリの作成時に、[(この組織ディレクトリ内のアカウントのみ (Microsoft のみ - シングル テナント))] を選択した場合、Microsoft Entra ID アプリ用に前に記録したテナント ID を入力します。
      • ただし、[任意の組織のディレクトリ内のアカウント (任意の Microsoft Entra ID ディレクトリ - マルチテナントと個人の Microsoft アカウント (Xbox、Outlook.com など)] または [任意の組織ディレクトリ内のアカウント (Microsoft Azure AD ディレクトリ - マルチテナント)] を選択した場合は、テナント ID の代わりに「common」と入力します。 それ以外の場合、Microsoft Entra ID アプリは ID が選択されているテナントを通じて検証され、個人の Microsoft アカウントは除外されます。

      これは、認証可能なユーザーに関連付けられるテナントになります。 詳細については、Microsoft Entra ID のテナントに関する説明を参照してください。

    7. [スコープ] には、アプリケーションの登録から選択したアクセス許可の名前を入力します。 テスト目的の場合は、「openid profile」とのみ入力します。

      Note

      Microsoft Entra ID の場合、[スコープ] フィールドはスペースで区切った値のリストであり、大文字と小文字が区別されます。

  5. [保存] を選択します。

Note

これらの値によって、アプリケーションは Microsoft Graph API 経由で Office 365 データにアクセスできます。 また、[トークン交換 URL] は、Microsoft Entra ID でのみ SSO に使用されるため、空白のままにしておく必要があります。

接続のテスト

  1. 接続入力を選択して、作成した接続を開きます。
  2. [サービス プロバイダー接続設定] ウィンドウの上部にある [テスト接続] を選択します。
  3. 初回は新しいブラウザー タブが開き、アプリが要求しているアクセス許可の一覧が表示され、承認を求められます。
  4. 承諾を選択します。
  5. これにより、[<your-connection-name> への接続テストに成功しました] ページにリダイレクトされます。

ボット コードでこの接続名を使用してユーザー トークンを取得できるようになりました。

ボット コードを準備する

このプロセスを完了するには、ボットのアプリ ID とパスワードが必要になります。

  1. 使用するサンプルのクローンを GitHub リポジトリから作成します:ボット認証またはMicrosoft Graph 用ボット認証.

  2. appsettings.json を更新します。

    • ConnectionName を、お使いのボットに追加した OAuth 接続設定の名前に設定します。

    • MicrosoftAppId および MicrosoftAppPassword を、お使いのボットのアプリ ID とアプリ シークレットに設定します。

      お使いのボット シークレットに含まれる文字によっては、パスワードを XML でエスケープすることが必要な場合があります。 たとえば、アンパサンド (&) は &amp; のようにエンコードする必要があります。

    {
      "MicrosoftAppType": "",
      "MicrosoftAppId": "",
      "MicrosoftAppPassword": "",
      "MicrosoftAppTenantId": "",
      "ConnectionName": ""
    }
    

    パブリック クラウドのデータ所在地を持つボットで OAuth を使用するには、appsettings に次の構成を追加する必要があります

    "OAuthUrl": "<Regional-OAuth-Uri>",
    "ToChannelFromBotOAuthScope": "https://api.botframework.com",
    "ToChannelFromBotLoginUrlTemplate": "https://api.botframework.com",
    "PublicAzureChannel": "https://api.botframework.com",
    "ToBotFromChannelOpenIdMetadataUrl": "https://login.botframework.com/v1/.well-known/openidconfiguration",
    "ToBotFromEmulatorOpenIdMetadataUrl": "https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration",
    "ToBotFromChannelTokenIssuer": "https://api.botframework.com",
    "ToChannelFromBotLoginUrl": "https://login.microsoftonline.com/botframework.com",
    

    <Regional-OAuth-Url> は、次のいずれかの URI です。

    URI 説明
    https://europe.api.botframework.com ヨーロッパにデータ所在地があるパブリック クラウド ボットの場合。
    https://unitedstates.api.botframework.com 米国にデータ所在地があるパブリック クラウド ボットの場合。
    https://india.api.botframework.com インドにデータ所在地があるパブリック クラウド ボットの場合。
  3. Startup.cs の更新:

    政府機関向けクラウドなど、パブリックではない Azure クラウドで OAuth を使用するには、Startup.cs ファイルに次のコードを追加する必要があります。

    string uri = "<uri-to-use>";
    MicrosoftAppCredentials.TrustServiceUrl(uri);
    OAuthClientConfig.OAuthEndpoint = uri;
    
    

    ここでにある <uri-to-use> は次のいずれかの URI です。

    URI 説明
    https://api.botframework.azure.us データ所在地のない米国政府機関向けクラウド ボットの場合。
    https://api.botframework.com データ所在地のないパブリック クラウド ボットの場合。 これはデフォルト URI であり、Startup.cs を変更する必要はありません。

Microsoft アプリ IDMicrosoft アプリ パスワードの値を取得するには、「登録パスワードの取得」を参照してください。

Note

ここで、このボット コードを Azure サブスクリプションに発行 (プロジェクトを右クリックして [発行] を選択) することもできますが、この記事では不要です。 Azure portal でボットを構成するときに使用したアプリケーションとホスティング プランを使用する発行構成を設定する必要があります。

エミュレーターを使ってボットをテストする

Bot Framework Emulator をインストールします (まだインストールしていない場合)。 「エミュレーターを使用したデバッグ」もご覧ください。

ボット サンプル ログインを機能させるには、「認証用にエミュレーターを構成する」に示されているようにエミュレーターを構成する必要があります。

テスト

認証メカニズムを構成したら、実際にボット サンプル テストを実行できます。

Note

ボット サンプルの実装方法により、”マジック コード" を入力するように求められる場合があります。 このマジック コードは RFC # 7636 の一部であり、さらなるセキュリティ要素を追加するために用意されています。 マジック コードを削除すると、セキュリティ上のリスクが高まります。 これは、強化された認証が有効になっている Direct Line を使用することで軽減できます。 詳細については、「Bot Framework の強化された認証」を参照してください。

  1. お使いのマシン上でローカルでボット サンプルを実行します。
  2. エミュレーターを起動します。
  3. ボットに接続するときに、ボットのアプリ ID とパスワードを入力する必要があります。
    • Azure アプリの登録からアプリ ID とパスワードを取得します。 これらは、appsettings.json または .env ファイルでボット アプリに割り当てたものと同じ値です。 エミュレーターで、これらの値を構成ファイルで、または初めてボットに接続するときに割り当てます。
    • ボット コード内のパスワードを XML エスケープする必要がある場合は、ここでもそれを行う必要があります。
  4. help と入力すると、ボットで使用できるコマンドの一覧が表示され、認証機能をテストします。
  5. サインインした後は、サインアウトするまで、資格情報を再度入力する必要はありません。
  6. サインアウトして認証をキャンセルするには、logout と入力します。

Note

ボット認証では Bot Connector Service を使用する必要があります。 このサービスは、Azure Bot リソースから情報にアクセスします。

認証の例

ボット認証サンプルでは、ダイアログは、ユーザーのログイン後、ユーザー トークンを取得するように設計されています。

Sample conversation with the authentication sample bot.

Microsoft Graph 用認証の例

Microsoft Graph 用ボット認証サンプルでは、ダイアログは、ユーザーのログイン後、制限された一部のコマンドを受け取るように設計されています。

Sample conversation with the Microsoft Graph authentication sample bot.


追加情報

ユーザーがボットに何らかの処理を要求し、それによってボットでユーザーのログインが必要になった場合、ボットによって OAuthPrompt が使用され、特定の接続に必要なトークンの取得が開始されます。 OAuthPrompt では、以下で構成されるトークン取得フローが作成されます。

  1. 既に Azure AI Bot Service に現在のユーザーおよび接続用のトークンがあるかどうかを確認するためのチェック。 トークンがある場合は、そのトークンが返されます。
  2. キャッシュされたトークンが Azure AI Bot Service にない場合は、OAuthCard が作成されます。これは、ユーザーがクリックできるログイン ボタンです。
  3. ユーザーが OAuthCard ログイン ボタンをクリックしたら、Azure AI Bot Service によって、ユーザーのトークンがボットに直接送信されます。または、チャット ウィンドウに 6 桁の認証コードがユーザーに表示されます。
  4. ユーザーに認証コードが表示される場合は、ボットによって、この認証コードがユーザーのトークンと交換されます。

次のセクションでは、一般的な認証タスクが、サンプルによってどのように実装されているかを説明します。

OAuth プロンプトを使用してユーザーをサインインさせて、トークンを取得する

Architecture diagram for the C# sample.

Dialogs\MainDialog.cs

OAuth プロンプトを、コンストラクター内の MainDialog に追加します。 ここでは、接続名の値は appsettings.json ファイルから取得されました。

AddDialog(new OAuthPrompt(
    nameof(OAuthPrompt),
    new OAuthPromptSettings
    {
        ConnectionName = ConnectionName,
        Text = "Please Sign In",
        Title = "Sign In",
        Timeout = 300000, // User has 5 minutes to login (1000 * 60 * 5)
    }));

ダイアログ ステップ内で、BeginDialogAsync を使用して OAuth プロンプトを起動します。これによりユーザーのサインインが求められます。

  • ユーザーがサインイン済みの場合は、ユーザーに問い合わせることなく、トークン応答イベントが生成されます。
  • それ以外の場合は、ユーザーのサインインが求められます。 ユーザーがログインを試みた後、Azure AI Bot Service からトークン応答イベントが送信されます。
return await stepContext.BeginDialogAsync(nameof(OAuthPrompt), null, cancellationToken);

次のダイアログ ステップ内で、前のステップの結果としてトークンが存在することを確認します。 null でない場合、ユーザーは正常にログインしています。

// Get the token from the previous step. Note that we could also have gotten the
// token directly from the prompt itself. There is an example of this in the next method.
var tokenResponse = (TokenResponse)stepContext.Result;

TokenResponseEvent の待機

OAuth プロンプトを起動すると、そのプロンプトは、ユーザーのトークン取得元となるトークン応答イベントを待ちます。

Bots\AuthBot.cs

AuthBotActivityHandler から派生し、トークン応答イベント アクティビティを明示的に処理します。 ここではアクティブなダイアログを続行します。これにより OAuth プロンプトでイベントを処理し、トークンを取得できます。

protected override async Task OnTokenResponseEventAsync(ITurnContext<IEventActivity> turnContext, CancellationToken cancellationToken)
{
    Logger.LogInformation("Running dialog with Token Response Event Activity.");

    // Run the Dialog with the new Token Response Event Activity.
    await Dialog.RunAsync(turnContext, ConversationState.CreateProperty<DialogState>(nameof(DialogState)), cancellationToken);
}

ユーザーをログアウトする

接続のタイムアウトを使用するのではなく、ユーザーが明示的にログアウトできるようにすることをお勧めします。

Dialogs\LogoutDialog.cs

private async Task<DialogTurnResult> InterruptAsync(DialogContext innerDc, CancellationToken cancellationToken = default(CancellationToken))
{
    if (innerDc.Context.Activity.Type == ActivityTypes.Message)
    {
        var text = innerDc.Context.Activity.Text.ToLowerInvariant();

        if (text == "logout")
        {
            // The UserTokenClient encapsulates the authentication processes.
            var userTokenClient = innerDc.Context.TurnState.Get<UserTokenClient>();
            await userTokenClient.SignOutUserAsync(innerDc.Context.Activity.From.Id, ConnectionName, innerDc.Context.Activity.ChannelId, cancellationToken).ConfigureAwait(false);

            await innerDc.Context.SendActivityAsync(MessageFactory.Text("You have been signed out."), cancellationToken);
            return await innerDc.CancelAllDialogsAsync(cancellationToken);
        }
    }

    return null;
}

Teams 認証の追加

OAuth は、Teams では他のチャンネルとは異なる方法で処理されます。 Teams 認証ボットのサンプル (C#JavaScriptJava、または Python) は、Teams の認証を適切に実装する方法を示しています。

参考資料