在 iframe 中嵌入Azure Data Explorer Web UI

使用 “版本 ”下拉列表切换服务。 了解有关导航的详细信息
适用于:✅ Azure Data Explorer

可以在 iframe 中嵌入 Azure 数据资源管理器 Web UI,并将其托管在第三方网站上。 本文介绍如何在 iframe 中嵌入Azure Data Explorer Web UI。

Azure 数据资源管理器 Web UI 的屏幕截图。

所有功能都经过可访问性测试,并且支持深色和浅色屏幕主题。

如何在 iframe 中嵌入 Web UI

将以下代码添加到网站:

<iframe
  src="https://dataexplorer.azure.cn/?f-IFrameAuth=true&f-UseMeControl=false&workspace=<guid>"
></iframe>

查询 f-IFrameAuth 参数告知 Web UI 重定向以获取身份验证令牌,参数 f-UseMeControl=false 告知 Web UI 显示用户帐户信息弹出窗口。 这些操作是必需的,因为托管网站负责身份验证。

workspace=<guid> 查询参数为嵌入的 iframe 创建单独的工作区。 工作区是包含选项卡、查询、设置和连接的逻辑单元。 通过将它设置为唯一值,它可防止嵌入版本和无变量版本 https://dataexplorer.azure.cn之间的数据共享。

处理身份验证

嵌入 Web UI 时,托管页将处理身份验证。 下图描述了身份验证流。

显示嵌入式 Web UI iframe 身份验证流的示意图。

显示嵌入 Web UI iframe 时所需的范围的示意图。

使用以下步骤处理身份验证:

  1. 在应用程序中,侦听 getToken 消息。

    window.addEventListener('message', (event) => {
       if (event.origin === "https://dataexplorer.azure.cn" && event.data.type === "getToken") {
         // CODE-1: Replace this placeholder with code to get the access token from Microsoft Entra ID and
         //         then post a "postToken" message with an access token and an event.data.scope
       }
    })    
    
  2. 定义一个函数以将 event.data.scope 映射到 Microsoft Entra 范围。 使用下表确定如何将 event.data.scope 映射到 Microsoft Entra 范围:

    资源 event.data.scope Microsoft Entra 范围
    集群 query https://{your_cluster}.{your_region}.kusto.chinacloudapi.cn/.default
    Graph People.Read People.ReadUser.ReadBasic.AllGroup.Read.All
    仪表板 https://rtd-metadata.chinacloudsites.cn/user_impersonation https://rtd-metadata.chinacloudsites.cn/user_impersonation

    例如,以下函数根据表中的信息映射范围。

        function mapScope(scope) {
            switch(scope) {
                case "query": return ["https://your_cluster.your_region.kusto.chinacloudapi.cn/.default"];
                case "People.Read": return ["People.Read", "User.ReadBasic.All", "Group.Read.All"];
                default: return [scope]
            }
        }
    
  3. Perform Single Page Application (SPA) 身份验证 为该范围获取 JWT 访问令牌。 此代码替换占位符 CODE-1。

    例如,可以使用 @azure/MSAL-react 获取访问令牌。 该示例使用之前定义的 mapScope 函数。

    import { useMsal } from "@azure/msal-react";
    const { instance, accounts } = useMsal();
    
    instance.acquireTokenSilent({
      scopes: mapScope(event.data.scope),
      account: accounts[0],
    })
    .then((response) =>
        var accessToken = response.accessToken
        // - CODE-2: Replace this placeholder with code to post a "postToken" message with an access token and an event.data.scope
    )
    

    重要

    只能使用用户主体名称(UPN)进行身份验证;不支持服务主体。

  4. 使用访问令牌发布 postToken 消息。 此代码替换占位符 CODE-2:

         iframeWindow.postMessage({
             "type": "postToken",
             "message": // the access token your obtained earlier
             "scope": // event.data.scope as passed to the "getToken" message
         }, 'https://dataexplorer.azure.cn'); 
       }
    

    重要

    托管窗口必须在过期之前通过发送包含更新令牌的新 postToken 消息来刷新令牌。 否则,令牌过期后,服务调用将失败。

提示

在示例项目中,可以查看使用身份验证 的应用程序

嵌入仪表板

若要嵌入仪表板,必须在主机的Microsoft Entra 应用与 Azure 数据资源管理器仪表板服务(RTD 元数据服务)之间建立信任关系。

  1. 执行执行单页应用程序 (SPA) 身份验证中的步骤。

  2. 打开 Azure 门户 ,确保登录到正确的租户。 在右上角,验证用于登录的身份。

  3. 在资源窗格中,选择Microsoft Entra ID>App registrations

  4. 找到使用On-Behalf-Of流的应用并将其打开。

  5. 选择“清单”。

  6. 选择requiredResourceAccess

  7. 在清单中添加以下条目:

    重要

    <RTD Metadata Service - Application ID> 替换为 RTD 元数据服务 的应用程序 ID。 若要获取此服务的应用程序 ID,请执行以下步骤:

    • 登录到 Azure 门户。
    • 在搜索栏中,输入 RTD 元数据服务,然后选择 服务主体RTD 元数据服务
    • RTD 元数据服务的“企业应用程序”页上,记下应用程序 ID 的值。
      {
        "resourceAppId": "<RTD Metadata Service - Application ID>",
        "resourceAccess": [
            {
                "id": "388e2b3a-fdb8-4f0b-ae3e-0692ca9efc1c",
                "type": "Scope"
            }
        ]
      }
    

    在上述代码中,388e2b3a-fdb8-4f0b-ae3e-0692ca9efc1c 是 user_impersonation 权限。

  8. 清单中保存更改。

  9. 选择API 权限,并确认已经添加一个新条目:RTD 元数据服务

  10. 在Microsoft Graph下,为 People.ReadUser.ReadBasic.AllGroup.Read.All 添加权限。

  11. 在Azure PowerShell中,为应用添加以下新服务主体:

    重要

    替换为 <RTD Metadata Service - Application ID> 之前获取的 RTD 元数据服务 的应用程序 ID。

    New-MgServicePrincipal -AppId <RTD Metadata Service - Application ID>
    

    如果您遇到 Request_MultipleObjectsWithSameKeyValue 错误,则说明该应用已在租户中。

  12. 在“API 权限”页中,选择“授予管理员同意”以同意所有用户。

注意事项

若要在没有查询区域的情况下嵌入仪表板,请使用以下设置:

 <iframe src="https://dataexplorer.azure.cn/dashboards?[feature-flags]" />

[feature-flags] 的值是:

"f-IFrameAuth": true,
"f-PersistAfterEachRun": true,
"f-Homepage": false,
"f-ShowPageHeader": false,
"f-ShowNavigation": false,
"f-DisableExploreQuery": false,

功能标志

重要

必须指定 f-IFrameAuth=true 标志才能使 iframe 正常工作。 其他标志是可选项。

托管应用可能想要控制用户体验的某些方面。 例如,隐藏连接窗格或禁止连接到其他群集。 针对这种情况,Web 浏览器支持功能标志。

功能标志可在 URL 中用作查询参数。 若要禁用添加其他群集,请在托管应用中使用 https://dataexplorer.azure.cn/?f-ShowConnectionButtons=false

设置 说明 默认值
f-显示共享菜单 显示“共享”菜单项
f-显示连接按钮 显示用于添加新群集的“添加连接”按钮
f-显示打开新窗口按钮 在 Web 中显示 open in web UI 按钮,该按钮会打开一个新的浏览器窗口,并将 https://dataexplorer.azure.cn 设置为具有正确群集和数据库作用域的指向目标。
f-ShowFileMenu 显示文件菜单(“下载”、“选项卡”、“内容”等)
f-ShowToS 从“设置”对话框中显示Azure Data Explorer 服务条款的链接
f-ShowPersona 在右上角的设置菜单中显示用户名。
f-UseMeControl 显示用户的帐户信息
f-IFrameAuth 如果为 true,则 Web 浏览器将需要 iframe 来处理身份验证并通过消息来提供令牌。 此参数对于 iframe 方案是必需的。
f-PersistAfterEachRun 通常,浏览器会在事件中持续 unload 。 但是,unload 在 iframe 中托管时,不一定会触发该事件。 此标志会在每次查询运行之后触发持久化本地状态事件。 这限制了可能发生的任何数据丢失,以便仅影响从未运行的新查询文本。
f-ShowSmoothIngestion 如果为 true,则会在右键单击数据库时显示引入向导体验
f-RefreshConnection 如果为 true,则始终在加载页面时刷新模式,不依赖于本地存储。
f-显示页面页眉 如果条件为 true,则显示包含 Azure Data Explorer 标题和设置的页面页眉。
f-隐藏连接窗口 如果为 true,则左侧的连接窗格不会显示
f-SkipMonacoFocusOnInit 修复了承载在 iframe 上时的焦点问题
f-主页 启用主页并将新用户重定向到该页面
f-显示导航 如果为 true,则显示左侧的导航窗格
f-DisableDashboardTopBar 如果为 true,则在仪表板中隐藏顶部栏
f-禁用新仪表板 如果为 true,则隐藏用于添加新仪表板的选项
f-DisableDashboardEditMenu 如果为 true,则隐藏用于编辑仪表板的选项
禁用仪表板文件菜单 如果为 true,则在仪表板中隐藏文件菜单按钮
f-禁用仪表板共享菜单 如果为 true,则在仪表板中隐藏共享菜单按钮
f-禁用控制面板删除 如果为 true,则隐藏仪表板删除按钮
f-禁用磁贴刷新 如果为 true,则在仪表板中禁用磁贴刷新按钮
f-禁用仪表板自动刷新 当值为 true 时,将在仪表板中禁用磁贴的自动刷新。
f-DisableExploreQuery 如果为 true,则禁用磁贴的 “浏览查询 ”按钮
f-禁用交叉筛选 如果为 true,则在仪表板中禁用交叉筛选功能
隐藏仪表板参数栏 如果为 true,则在仪表板中隐藏参数栏