Power BI レポート
PowerBIReport Power BIライセンスを持っていないユーザーに対しては、ポータル内でPower BIレポートを表示します。各ビューアは自分の行のみを表示します。これは独自のパッケージに含まれており、Blazorは PowerPortalsPro.Web.Blazor.PowerBI 、ReactはReact @powerportalspro/react-powerbi 、レポートがないポータルにはPower BIのスクリプトは含まれません。
import { PowerBIReport } from '@powerportalspro/react-powerbi';
<PowerBIReport reportKey="account-sales" height="700px" />@using PowerPortalsPro.Web.Blazor.PowerBI.Components
<PowerBIReport ReportKey="account-sales" Height="700px" />仕組み
コンポーネントはキーでレポートに名前を付けます。ポータルはキーを調べ、ビューアがレポートを見られるかどうかを判断し、Power BIにトークンを求めます。これはすでにDataverseに接続されているアイデンティティなので、ポータルで設定する必要はなくなります。トークンにはビューアのIDがユーザー名として記載されます。連絡先IDや、スタッフがポータルにサインインしている場合はユーザーID。サインインしていない訪問者はユーザー名をその anonymous受け取ります。コンポーネントはトークンが期限切れになる数分前に更新し、期限切れ後もレポートの状態を維持します。
各ビューアは1分間に30回、アカウントでサインインしたユーザー、アドレスで訪問者を報告トークンの要求をし、429で拒否されます。トークンは実行時間がある間に再利用されるため、ページが近づくことはありません。この制限により、繰り返しのリクエストをポータルやPower BIに負荷に変えるのを防ぎます。設定 PowerPortalsPro:PowerBIRateLimit:PermitLimit と Window で変更してください。 PermitLimit 0になると停止します。
報告の登録
どのレポートをポータルで誰に表示するかは、コードではなくDataverse内のデータです。なぜなら、各環境が独自のワークスペースからレポートを埋め込んでいるからです。Power Portals Proソリューションの2つのテーブルにこのレポートが収録されています:
- ポータルPower BIレポート — コンポーネント名のキーと、それが代表するPower BIワークスペースとレポートです。 「行レベルのセキュリティなしに許可 」はデフォルトでオフです。行レベルのセキュリティがないモデルのレポートは拒否されます。なぜなら、すべてのビューアがすべての行を視認してしまうからです。
- ポータルPower BIレポートアクセス — 誰がレポートを見ることができるか、そしてそのモデルの役割がどのものか。各行はポータル役割の保持者、サインイン済みユーザー、匿名の訪問者、または内部ユーザー(スタッフは連絡先ではなく自分自身としてサインイン)用で、モデルの役割をカンマで区切ってPower BIの役割に記載しています。
ビューアは、アクセス行のいずれかが適用されるときにレポートを目にします。すべての役割は名前を適用する行です。レポートを含まないキーとビューア向けでないレポートは同じように見えます:レポートが利用可能でないというメッセージです。登録は15分ごとに読み込まれます。 PowerBIReports キャッシュをクリアして、一度に変更を適用してください。
行レベルのセキュリティ
Power BIはレポートの行レベルのセキュリティをトークンのユーザー名に適用します。各ビューアを自分の行に保つために、モデルに連絡先IDを持つ列を USERNAME()と比較する役割を与えます。
[contactid] = USERNAME()
ポータルはトークンを求める前にモデルを確認します。行レベルのセキュリティを持つモデルは、すべてのトークンにビューアのIDとロールを取得し、ロール名のないアクセス行は拒否されます。Power BIはロール名をチェックしないため、スペルミスロールはレポート作成時にのみ失敗します。MCPサーバーはアクセス行を書き込む際にモデルと照合します。
カスタムデータ
ロールはDAXのCUSTOMDATA()を通じてビューアが誰であるか、つまりアカウント番号や地域以外のものでフィルタリングできます。サーバーのProgram.csに登録IPowerBICustomDataProvider:ビューアーとアイテムの行レベルのセキュリティを持つモデルのアイテムに対してポータルが発行するすべてのトークンを要求し、返すものはトークンに格納されます。サーバー上で動作し、ブラウザからは削除されません。なぜならビューアがどの行を見るかを決めるからです。ビューア自身のPower BIアクセスで表示されたアイテムを要求されることもありません。
// Program.cs
builder.Services.AddScoped<IPowerBICustomDataProvider, RegionCustomData>();
// The viewer's sales region, from a lookup of your own, for a role that filters on it:
// NOT ISBLANK(CUSTOMDATA()) && [region] = CUSTOMDATA()
public class RegionCustomData(IRegionLookup regions) : IPowerBICustomDataProvider
{
public async ValueTask<string?> GetCustomDataAsync(PowerBICustomDataContext context, CancellationToken cancellationToken)
=> context.User.GetContactId() is { } contactId
? await regions.RegionOfAsync(contactId, cancellationToken)
: null;
}
MCPサーバーの add_powerbi_rls_role は、テキストカラムや数字カラムを比較する filter: "customdata"でこのような役割を書き込みます。また、フィルターはトークンにカスタムデータが必要なため、空欄のすべての行が空の代わりに、行がありません。
MCPサーバーでのセットアップ
MCPサーバーはレポート自体以外のすべてを設定し、Power BIアカウントとして機能し、フォルダごとに dnx PowerPortalsPro.Mcp powerbi loginで一度だけサインインします。そのアカウントにはPower BI Proライセンスが必要です。アシスタントにレポートの設定を依頼するか、自分でツールに連絡してください:
create_powerbi_workspacePower BI Desktopからレポートを公開するワークスペースを作成します。grant_powerbi_workspace_accessポータルのアイデンティティをそのメンバーにします。add_powerbi_rls_roleレポートのモデルに役割を書き込む:ビューアを自分の連絡先の行、会社、会社およびその子会社の行、マッピングテーブルがリストする行、固定値、あるいはすべての行を示す役割を保持する役割。また、レポートを再度公開するとモデルが置き換えられるため、DAXにPower BI Desktopでも同じ役割を追加できる。register_powerbi_reportそしてset_powerbi_report_access2つのDataverseテーブルを書きます。check_powerbiポータル自体としてサインインしたチェーン全体を確認した。
Power BIのテナント設定のうち2つはFabric管理者が変更可能です。 サービスプリンシパルはFabricの公開APIを呼び出し 、 アプリにコンテンツを埋め込むことができます。新しいテナントは両方をオンにします。どちらかがオフになると、 check_powerbi どちらをオンにするか指示されます。
ページを開き、記録にフィルターをかけて
PageName レポートをページ上で開き、 Filters 詳細ページが対象となるカラムの行に絞り込む。どちらかを変更すると、既に表示されているレポートに適用され、再読み込みせずに済みます。フィルターは利便性のためであり、セキュリティではありません。閲覧者はブラウザで削除できます。閲覧者が見るものは行レベルのセキュリティによって決まります。
<PowerBIReport
reportKey="account-sales"
pageName="ReportSection2"
filters={[{ table: 'Account', column: 'accountid', values: [accountId] }]}
/><PowerBIReport ReportKey="account-sales"
PageName="ReportSection2"
Filters="@(new[] { new PowerBIFilter("Account", "accountid", accountId) })" />ダッシュボードと単一タイル
登録はダッシュボード、またはダッシュボードのタイルの一つにレポートではなく名前を付けることができます。レポートには「 アイテムタイプ」とダッシュボードのIDとタイルが記載されています。同じコンポーネントが表示します: PowerBIReport はキーの登録名に埋め込まれます。ダッシュボードは幅に合わせてフィットし、 OnTileClicked (onTileClicked)はタイルをクリックしたタイミングとその先を示します。ページ、フィルター、ペイン、ポータルの色はレポートにのみ適用されます:ダッシュボードやタイルは作成時の様子を表示します。
ダッシュボードのタイルは複数のセマンティックモデルから来ることができ、それぞれレポートと同じルールに従います。行レベルのセキュリティを持つモデルはビューアのアイデンティティと役割を取得し、持たないモデルは登録が許可しない限り拒否されます。テキストや画像のタイルは行を読み取らず、どちらも必要ありません。 register_powerbi_report は dashboardを取り、 tile のタイルを1つに取り、ワークスペースのダッシュボードやタイルを一覧 list_powerbi_reports します。タイルはPower BIサービス内でピン留めされています。外部からタイアリングする方法はありません。
各ビューアのPower BIアクセス権
登録の 埋め込みモードで は、各ビューアのPower BIアクセス権でアイテムを表示できます。これはPower BIで見るものとは異なります。Power BIは独自の共有とモデルの行レベルのセキュリティを適用します( USERPRINCIPALNAME() がサインイン名です)。したがって、各ビューアは職場または学校のアカウント、Power BIライセンス、そして共有されたアイテムが必要です。アクセス行には「誰が質問してもよいか」が記載されています。彼らのPower BIの役割は使われていません。これはすでにPower BIを使っているスタッフやパートナーに適しています。顧客にとっては、ポータル自身のアクセスにはライセンスが不要です。
最初は、コンポーネントがビューアの仕事用アカウントをPower BIに接続することを提案します。ビューアはMicrosoftにサインインし、ポータルにPower BIレポートやダッシュボードを読み取らせてからページに戻ります。ポータルに与えるものはサーバー上に残り、ホストの IDistributedCacheで暗号化され、ブラウザは短期間しかアクセストークンを受け取りません。インメモリキャッシュがあれば、ポータル再起動後にビューアは再び接続でき、共有キャッシュ(Redis、SQL Server)で接続が保たれます。サインアウトすると接続が解除されます。個人のMicrosoftアカウント、Google、パスワードは接続できず、誰かがなりすますセッションも接続できません。
ビューアはポータルのMicrosoftサインインアプリ登録を通じて接続し、Power BIの委任されたReport.Read.AllとDashboard.Read.All、Microsoft Graphのopenidとoffline_access、そしてリダイレクトURIhttps://<portal host>/signin-powerbiが必要です。MCPサーバーのadd_powerbi_signin_permissionsがそれらすべてを追加し、register_powerbi_reportembedMode: "user"かかります。管理者のみの同意を許可するテナントは、一度だけ許可を得る必要があります。テナントのゲストも入れたい場合は、ワークスペースを保持するテナントにPowerBIOptions.TenantId設定してください。
カラーとダークモード
デフォルトではレポートはポータルの色、すなわち明暗のテーマ、アクセントカラー、ポータル自身のチャートが使うシリーズパレットを使います。訪問者がテーマを切り替えると、リロードせずにそのテーマに従います。色はレポートが置かれたFluentテーマから読み取られ、Power BIレポートテーマとして適用されます。このテーマはレポートのページ、テキスト、軸、フィルターペイン、シリーズを設定します。レポートの著者が設定した色は設定通りに維持され、Power BIはテーマに関わらずレポートの下にあるページのタブを独自の色で描画します。
ThemeJson 代わりにレポートに独自のテーマを与え、Power BIのテーマJSON形式で設定します。埋め込みレポートに適用されるテーマと同様に、レポートに付け加えるのではなく、保存されたテーマを置き換えます。 UsePortalTheme="false" レポートに保存されたテーマを保持します。
<PowerBIReport reportKey="sales" themeJson={contosoTheme} />
<PowerBIReport reportKey="sales" usePortalTheme={false} /><PowerBIReport ReportKey="sales" ThemeJson="@contosoTheme" />
<PowerBIReport ReportKey="sales" UsePortalTheme="false" />開発と生産
容量がないワークスペースはPower BIのトライアル埋め込みトークンを受け取り、数に制限があり、バナーが表示され、開発やテスト用です。本番環境では、ワークスペースをFabric容量に設定してください。 create_powerbi_capacity 価格表示後にAzureサブスクリプションにFabricを作成し、 set_powerbi_capacity_state 一時停止します。一時停止された容量はレポートを受け取りません。Premiumユーザーごとのワークスペースではポータル訪問者への埋め込みはサポートされていません。
PowerBIReport クラス
パラメータ
名称 | 種類 | デフォルト | 概要 |
|---|---|---|---|
FilterPaneVisible | bool | False | |
Filters | IReadOnlyList<PowerBIFilter>? | ||
Height | string | 600px | |
PageName | string? | ||
PageNavigationVisible | bool | True | |
ReportKey* | string | ||
ThemeJson | string? | ||
TransparentBackground | bool | False | |
UsePortalTheme | bool | True | |
Width | string | 100% |
FilterPaneVisibleFiltersHeightPageNamePageNavigationVisibleReportKey*ThemeJsonTransparentBackgroundUsePortalThemeWidthイベント
名称 | 種類 | 概要 |
|---|---|---|
OnDataSelected | EventCallback<PowerBIDataSelection> | |
OnError | EventCallback<string> | |
OnLoaded | EventCallback | |
OnPageChanged | EventCallback<PowerBIPage> | |
OnRendered | EventCallback | |
OnTileClicked | EventCallback<PowerBITileClick> |
OnDataSelectedOnErrorOnLoadedOnPageChangedOnRenderedOnTileClicked方法
名称 | パラメータ | 種類 | 概要 |
|---|---|---|---|
NotifyDataSelectedAsync | PowerBIDataSelection selection | Task | |
NotifyErrorAsync | string message | Task | |
NotifyLoadedAsync | Task | ||
NotifyPageChangedAsync | PowerBIPage page | Task | |
NotifyRenderedAsync | Task | ||
NotifyTileClickedAsync | PowerBITileClick click | Task | |
RenewTokenAsync | Task<PowerBIEmbedTokenResponse> |
NotifyDataSelectedAsyncNotifyErrorAsyncNotifyLoadedAsyncNotifyPageChangedAsyncNotifyRenderedAsyncNotifyTileClickedAsyncRenewTokenAsync