シングル サインオンについて
この記事の対象: SDK v4
シングル サインオン (SSO) を使用すると、独立したアプリケーション間でリソースへのアクセスを共有できます。 たとえば、ユーザーはルート ボットのサービスにサインインし、ルート ボットはアクセス トークンをスキル ボットと共有するようにできます。 現時点では、Microsoft Entra ID ID プロバイダーのみがサポートされています。
SSO は次のようなシナリオに適用されます。
- ルート ボットおよび 1 つまたは複数のスキル ボット。 ユーザーはルート ボットからサインインします。 その後、ボットはユーザーに代わって複数のスキルを呼び出します。
- Web サイトに埋め込まれたWeb チャット コントロール。 ユーザーは Web サイトからサインインします。 その後、Web サイトはユーザーに代わってボットまたはスキルを呼び出します。
SSO には次の利点があります。
- ユーザーは複数回サインインする必要はありません。
- ルート ボットまたは Web サイトは、ユーザーのアクセス許可を知る必要はありません。
Note
SSO は、Bot Framework SDK バージョン 4.8 以降で使用できます。
SSO コンポーネントの相互作用
次の時系列の図は、SSO のさまざまなコンポーネント間の相互作用を示しています。
次の図に、ルート ボットのフローを示します。
次の図は、Web チャット コントロールのフローとフォールバック フローを示しています。
トークン交換が失敗した場合、フォールバックはユーザーにサインインを求めるメッセージを表示します。 このようなエラーは、追加のアクセス許可が必要な場合、またはトークンが間違ったサービス用である場合に発生する可能性があります。
フローを分析してみましょう。
クライアントは、ボットとの会話を開始して OAuth シナリオをトリガーします。
ボットは OAuth カードをクライアントに送り返します。
クライアントは、OAuth カードをユーザーに表示する前にインターセプトし、
TokenExchangeResource
プロパティが含まれているかどうかを確認します。このプロパティが存在する場合、クライアントはボットに
TokenExchangeInvokeRequest
を送信します。 クライアントは、ユーザーの交換可能なトークンを持っている必要があります。これは Microsoft Entra ID トークンである必要があり、そのオーディエンスはTokenExchangeResource.Uri
プロパティと同じである必要があります。 クライアントは、次に示す本文を持つ呼び出しアクティビティをボットに送信します。{ "type": "Invoke", "name": "signin/tokenExchange", "value": { "id": "<any unique ID>", "connectionName": "<connection Name on the skill bot (from the OAuth Card)>", "token": "<exchangeable token>" } }
ボットは
TokenExchangeInvokeRequest
を処理し、クライアントにTokenExchangeInvokeResponse
を返します。 クライアントは、TokenExchangeInvokeResponse
を受け取るまで待つ必要があります。{ "status": "<response code>", "body": { "id":"<unique ID>", "connectionName": "<connection Name on the skill bot (from the OAuth Card)>", "failureDetail": "<failure reason if status code isn't 200, null otherwise>" } }
TokenExchangeInvokeResponse
のstatus
が200
の場合、クライアントは OAuth カードを表示しません。 "通常のフロー" 図を参照してください。 他のstatus
の場合、またはTokenExchangeInvokeResponse
を受け取っていない場合、クライアントは OAuth カードをユーザーに表示します。 "フォールバックのフロー" 図を参照してください。 これにより、エラーの発生時や、ユーザーの同意などの満たされない依存関係があった場合に、SSO フローが確実に通常の OAuthCard フローにフォールバックできます。