大屏监控 Metabase 集成到 C# 项目

集成 Metabase 的方法与实践

随着数据驱动决策的普遍性,数据可视化平台如 Metabase 变得越来越重要。Metabase 是一个开源的商业智能工具,可以轻松地帮助用户分析和可视化数据。本文将详细介绍如何在 C# 项目中集成 Metabase,并提供详细的代码示例。

集成概述

Metabase 比较适合的场景包括:

1、基于SSO的完整集成(支持下钻),在打开报表时完成用户在主系统跟报表系统的单点登录,需付费实现JWT集成;

2、按照静态嵌入方式,实现基于密钥的集成,此方案较公开分享方式更加安全,但由于未实现单点登录,无法使用下钻功能。

通常,嵌入是通过在您的网站中iframe内显示Metabase URL来实现的。**静态嵌入**(或签名嵌入)是一个使用签名JSON Web Token (JWT) 进行保护的Metabase URL的iframe。只有当请求提供在您的应用程序和Metabase之间共享的密钥进行签名的JWT时,Metabase才会加载URL。JWT还包含一个资源引用,例如仪表板ID,以及任何锁定参数的值。

您不能将静态嵌入与行和列安全、钻取一起使用,并且由于签名JWT不会创建用户会话(服务器端会话),因此用户特定数据不会捕获在使用情况分析中。有关这些功能,请参阅嵌入式分析JS。

但是,您可以通过锁定参数来限制特定人员或群组的静态嵌入数据。

集成代码

 以下是针对embed封装的console代码,需要添加Newtonsoft.Json、System.IdentityModel.Tokens.Jwt两个Nuget包。

 1 using System;
 2 using System.IdentityModel.Tokens.Jwt;
 3 using System.Security.Claims;
 4 using System.Text;
 5 using Microsoft.IdentityModel.Tokens;
 6 using Newtonsoft.Json.Linq;
 7 
 8 class JwtGenerator
 9 {
10     private const string MetabaseSiteUrl = "http://127.0.0.1:8080";
11     private const string MetabaseSecretKey = "15c2ed06f625d42a24369ba7840ee77da5891d853c654787af998de41ec0f10b";
12 
13     static void Main(string[] args)
14     {
15         int dashboardId = 1;
16         try
17         {
18             Console.WriteLine(GenerateDashboardUrl(dashboardId));
19         }
20         catch (Exception ex)
21         {
22             Console.WriteLine(ex.ToString());
23         }
24     }
25 
26     public static string GenerateDashboardUrl(int dashboardId)
27     {
28         // 生成HMAC-SHA256密钥
29         var keyBytes = Encoding.UTF8.GetBytes(MetabaseSecretKey);
30         var securityKey = new SymmetricSecurityKey(keyBytes);
31         var signingCredentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
32 
33         // 构建JWT声明
34         var claims = new[]
35         {
36             // 嵌套resource声明(转换为JSON对象)
37             new Claim("resource",
38                 JObject.FromObject(new { dashboard = dashboardId }).ToString(),
39                 JsonClaimValueTypes.Json),
40             // 空参数声明
41             new Claim("params", "{}", JsonClaimValueTypes.Json)
42         };
43 
44         // 配置Token参数
45         var tokenDescriptor = new JwtSecurityToken(
46             claims: claims,
47             expires: DateTime.UtcNow.AddMinutes(60), // 60分钟有效期,可按需调整
48             signingCredentials: signingCredentials
49         );
50 
51         // 生成Token字符串
52         var tokenHandler = new JwtSecurityTokenHandler();
53         string token = tokenHandler.WriteToken(tokenDescriptor);
54 
55         // 拼接Metabase嵌入式URL
56         return $"{MetabaseSiteUrl}/embed/dashboard/{token}?bordered=true&titled=false";
57     }
58 }

 

posted on 2026-03-16 14:33  icycore  阅读(1)  评论(0)    收藏  举报

导航