次の方法で共有


Azure Analysis Services (AAS) データベースを使用してレポートを埋め込む

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

この記事では、Azure Analysis Services (ASS) に格納されているデータを使用する Power BI レポートを、顧客用に埋め込むシナリオにおいて埋め込む方法について説明します。 この記事は、データベースが行レベルのセキュリティ (RLS) を実装するかどうかに関係なく、AAS データを含むレポートを埋め込む必要のある独立系ソフトウェア開発者 (ISV) を対象としています。

[前提条件]

RLS の有無にかかわらず、AAS データベースへのライブ接続を持つレポートが必要です。

動的セキュリティ - RLS

レポートで動的 RLS を実装する場合は、customeData 関数を使用します。 有効な ID をオーバーライドできないため、customData を使用して新しいロールを作成することをお勧めします。 username または userPrincipalName 関数を持つロールを使用することもできます (それらを customData に置き換えた場合)。

新しいロールを作成し、customData 関数をロールに追加するには、次の手順に従います。

  1. Analysis Services サーバーにロールを作成します。

    Analysis Services サーバーでの新しいロールの作成を示すスクリーンショット。

  2. [全般] 設定で、ロール名を指定し、データベース権限を [読み取り] のみに設定します。

    Analysis Services サーバーの全般設定で、新しいロールに新しい名前を指定し、それを読み取りのみに設定しているスクリーンショット。

  1. [メンバーシップ] 設定で、埋め込みトークン - トークンの生成 API を呼び出すユーザーを追加します。 管理者ではないサービス プリンシパルを使用している場合は、それも追加します。

    Analysis Services サーバーでの新しいロールへのユーザーの追加を示すスクリーンショット。

  2. "行フィルター" 設定で、CUSTOMDATA() 関数を使用して DAX クエリを設定します。

    Analysis Services サーバーの新しいロールで DAX クエリに関数 customData を追加する方法を示すスクリーンショット。

サービス プリンシパル

サービス プリンシパルを使用してレポートを埋め込む場合は、サービス プリンシパルが AAS のサーバー管理者またはロール メンバーであることを確認します。 AAS 管理者にサービス プリンシパルへのアクセス許可を付与するには、「サーバー管理者ロールへのサービス プリンシパルの追加」を参照してください。 サービス プリンシパルをロール メンバーとして追加するには、[メンバーシップ ] 設定に移動します。

ユーザー名としてサービス プリンシパル オブジェクト ID を使用します (有効な ID)。

Analysis Service の移行

埋め込まれた AAS レポートがある場合でも、AAS から Power BI Premium に移行できます。 埋め込みトークン - トークンの生成 API を呼び出しているプリンシパルがワークスペースのメンバーまたは管理者である限り、埋め込まれたレポートは移行中に中断されません。

注意

サービス プリンシパルが管理者ではなく、移行時にそれをワークスペースの管理者にしたくない場合は、別のワークスペースにそのモデルを移行し、そこで管理者アクセス許可をそれに付与できます。

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

トークンの生成 API を使用して、有効な ID をオーバーライドする埋め込みトークンを生成します。

埋め込みトークンを生成するために必要な情報は、Power BI ("サービス プリンシパル" または "マスター ユーザー") にどのように接続しているかと、データベースに RLS があるかどうかによって異なります。

埋め込みトークンを生成するには、次の情報を指定します。

  • ユーザー名 (RLS がない場合は省略可能。RLS に必要) - ユーザー名は API 呼び出し元 (この場合はマスター ユーザーの UPN) と同じである必要があります。 データベースが RLS を使用せず、ユーザー名が指定されていない場合は、マスター ユーザーの資格情報が使用されます。
  • ロール (RLS に必要) - レポートには、有効な ID がロールのメンバーである場合にのみデータが表示されます。

例:

次の 3 つのシナリオのいずれかに、ユーザー ID とロールを定義します。

  • RLS が実装されていない場合:

有効な ID を定義する必要はありません。

  • 静的 RLS を使用する場合:

        var rlsidentity = new EffectiveIdentity(  //If static RLS
           username: "username@contoso.com", 
           roles: new List<string>{ "MyRole" },
           datasets: new List<string>{ datasetId.ToString()}
        )
    
  • 動的 RLS を使用する場合:

        var rlsidentity = new EffectiveIdentity(  // If dynamic RLS
           username: "username@contoso.com",
           roles: new List<string>{ "MyRoleWithCustomData" },
           customData: "SalesPersonA"
           datasets: new List<string>{ datasetId.ToString()}
        )
    

    注意

    埋め込みトークンの customData は、1,024 文字を超えることはできません。

有効な ID を使用して埋め込みトークンを生成します。

public EmbedToken GetEmbedToken(Guid reportId, IList<Guid> datasetIds, [Optional] Guid targetWorkspaceId)
{
    PowerBIClient pbiClient = this.GetPowerBIClient();
    // 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 } // Only in cases of RLS
    );
    // Generate an embed token
    var embedToken = pbiClient.EmbedToken.GenerateToken(tokenRequest);
    return embedToken;
}

埋め込みトークンを使用して、レポートをアプリまたは Web サイトに埋め込みます。 レポートでは、レポート内の適用された RLS に従ってデータがフィルター処理されます。