关于单点登录
适用于:SDK v4
单一登录 (SSO) 允许跨独立应用程序共享资源。 例如,用户可以登录到根机器人中的服务,根机器人可以与技能机器人共享访问令牌。 目前仅支持 Microsoft Entra ID 标识提供者。
SSO 适用于以下方案:
- 根机器人和一个或多个技能机器人。 用户从根机器人登录。 然后,机器人就会代表该用户调用多项技能。
- 嵌入在网站上的 Web 聊天控件。 用户从网站登录。 然后,网站代表用户调用机器人或技能。
SSO 带来下列好处:
- 用户不必多次登录。
- 根机器人或网站不需要知道用户的权限。
注意
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 流。