Share via


RLS を使用してレポートを埋め込む

適用対象: アプリ所有データ ユーザー所有データ

この記事では、RLS を使用した Power BI コンテンツを、標準の Power BI アプリ所有のデータ アプリケーションに埋め込む方法について説明します。

前提条件

RLS の設定方法の詳細については、「Power BI での行レベルのセキュリティ (RLS)」を参照してください。

RLS ロールを定義する場合、使用する DAX 式によって RLS モデルが静的か動的かが決まることに注意してください。

静的および動的セキュリティを使用する場合

静的セキュリティ では、DAX フィルターの固定値を使用して各ロールを定義します。 実装は簡単ですが、多くのユーザーや組織が関与している場合は、保守が困難です。

静的セキュリティは、異なるデータへのアクセスが各部門で必要となる場合に、少数の大型顧客にサービスを提供する ISV に最適です。

動的セキュリティでは、DAX 関数 (username() または userprincipalname()) を使用してロールを定義します。 動的セキュリティを使用すると、柔軟性が向上すると同時に、より少ないロールとより少ない保守作業でデータを管理することができます。

静的セキュリティ

静的ロールの場合は、埋め込みトークンを生成する際に、ロールを Power BI に渡します。すると、そのロールに従ってユーザーにデータが表示されます。 静的セキュリティ ロールを作成するには、DAX フィルターに固定値を入力します。

たとえば、米国東部のロールを [Region] = "East" として定義できます。

静的な RLS ロールを定義する方法を示すスクリーンショット。

たとえば、john@contoso.com を、アプリのユーザーとします。 米国東部のロールからデータへのアクセス権を John に付与する必要があります。 john@contoso.com 用のレポートを埋め込むには、米国東部ロールを使用して埋め込みトークンを生成します。 結果のデータは [Region] = "East" でフィルター処理されます。

Note

埋め込みトークンを生成する場合は、ユーザー名を指定する必要がありますが、ユーザー名には任意の文字列を指定できます。 静的ロールには、ユーザー名に依存しない固定値があるため、ISV によってユーザーのロールが決定され、それが埋め込みトークンに渡されると、渡されたユーザー名に関係なく、そのロールに従ってデータがフィルター処理されます。

動的なセキュリティ

動的セキュリティでは、DAX 関数 (username() または userprincipalname()) を使用してロールを定義します。

ユーザー所有のデータ シナリオでは、特定のユーザーのロールに基づいて、RLS モデルでデータが自動的にフィルター処理されます。 アプリ所有データの場合、Power BI によって ISV の顧客のユーザー名が認識されていないため、username() 関数を使用してデータを動的にフィルタリングできます。

Power BI Desktop で username() 関数を使用してロールを作成します。 たとえば、CountryDynamic という名前のロールを作成し、それを次のように定義できます: [CountryRegionCode] = username()

動的な RLS ロールを作成する方法を示すスクリーンショット。

たとえば、France のデータへのアクセス権を、ユーザー jane@contoso.com に付与するとします。 jane@contoso.com の埋め込みトークンを生成する場合は、文字列 FranceCountryDynamic ロールの "ユーザー名" として渡します。 データは [CountryRegionCode] = France に従ってフィルター処理されます。

{
    "accessLevel": "View",
    "identities": [
        {
            "username": "France",
            "roles": [ "CountryDynamic"],
            "datasets": [ "fe0a1aeb-f6a4-4b27-a2d3-b5df3bb28bdc" ]
        }
    ]
}

このシナリオで動的セキュリティを使用する場合、すべてのリージョンに対して必要なロールは 1 つだけです。 リージョン名は、有効な ID として使用されます。

埋め込みトークンを生成する

レポートをアプリに埋め込む準備ができたら、埋め込みトークンを生成する必要があります。 埋め込みトークン API を使用してトークンを生成するには、次の情報を API に渡します。

  • username (必須) - ロールが動的である場合、username 文字列がフィルターとして使用されます。 静的ロールの場合、ユーザー名 は RLS に影響することはなく、任意の文字列とすることができます。 リストできるユーザーは 1 つだけです。
  • roles (必須) - 行レベル セキュリティ規則を適用するときに使用されるロール。 複数のロールを渡す場合は、文字列の配列として渡す必要があります。
  • データセット (必須) - 埋め込むアイテムで使われるデータセットです。

これで、レポートをアプリに埋め込むことができます。 レポートでは、適用された RLS に従ってデータがフィルター処理されます。

public EmbedToken GetEmbedToken(Guid reportId, IList<Guid> datasetIds, [Optional] Guid targetWorkspaceId)
    {
        PowerBIClient pbiClient = this.GetPowerBIClient();

       // Defines the user identity and roles.
        var rlsIdentity = new EffectiveIdentity(
            username: "France",
            roles: new List<string>{ "CountryDynamic" },
            datasets: datasetIds.Select(id => id.ToString()).ToList());
        );
       
        // Create a request for getting an embed token for the rls identity defined above
        var tokenRequest = new GenerateTokenRequestV2(
            reports: new List<GenerateTokenRequestV2Report>() { new GenerateTokenRequestV2Report(reportId) },
            datasets: datasetIds.Select(datasetId => new GenerateTokenRequestV2Dataset(datasetId.ToString())).ToList(),
            targetWorkspaces: targetWorkspaceId != Guid.Empty ? new List<GenerateTokenRequestV2TargetWorkspace>() { new GenerateTokenRequestV2TargetWorkspace(targetWorkspaceId) } : null,
            identities: new List<EffectiveIdentity> { rlsIdentity }
        );

        // Generate an embed token
        var embedToken = pbiClient.EmbedToken.GenerateToken(tokenRequest);

        return embedToken;
    }

考慮事項と制限事項

  • セットアップによっては、埋め込みトークンを生成する前にいくつかの手順を行う必要がある場合があります。 さまざまなシナリオの詳細については、「セキュリティ機能が使用されているレポートを埋め込む」を参照してください。
  • 埋め込みトークンを生成するユーザーは、両方のワークスペース (データセット ワークスペースとレポート ワークスペース) の "メンバー" または "管理者" である必要があります。
  • 埋め込みトークンを生成するときは、ユーザー名とロールを指定する必要があります。 これを行わないと、サービス プリンシパルとマスター ユーザーのどちらによってトークンが生成されているかに応じて、次のいずれかのイベントが発生します。
    • サービス プリンシパルの場合、トークンの生成は失敗します。
    • マスター ユーザーの場合、トークンの生成は成功しますが、データはフィルター処理されません (すべてのデータが返されます)。

他にわからないことがある場合は、 Power BI コミュニティを利用してください。