共用方式為


使用 RLS 內嵌報表

適用於: 應用程式擁有資料 使用者擁有資料

本文說明如何將使用 RLS 的 Power BI 內容内嵌至標準 Power BI 應用程式擁有的資料應用程式中。

必要條件

如需如何設定 RLS 的詳細說明,請參閱 Power BI 的列層級安全性 (RLS)

定義 RLS 角色時,請記住,您使用的 DAX 運算式决定了 RLS 模型為靜態還是動態。

何時使用靜態和動態安全性

靜態安全性在 DAX 篩選中使用定值來定義每個角色。 它很容易實作,但當涉及許多使用者或組織時,很難維護。

靜態安全性最適合服務於一個或幾個大客戶的 ISV,其中每個部門都需要存取不同的資料。

動態安全性使用 DAX 函式 (username()userprincipalname()) 來定義角色。 動態安全性提供了更大的靈活性,並允許您使用更少的角色和更少的維護來管理資料。

靜態安全性

使用靜態角色,當您產生內嵌權杖時,您將角色傳遞給 Power BI,使用者將根據該角色看到資料。 若要建立靜態安全性角色,請在 DAX 篩選中輸入定值。

例如,您可以將美國東部的角色定義為 [Region] = "East"

顯示如何定義靜態 R L S 角色的螢幕擷取畫面。

假設 john@contoso.com 是您應用程式的使用者。 您想讓 John 存取美國東部角色的資料。 若要内嵌 john@contoso.com 的報表,請使用美國東部角色產生內嵌權杖。 對產生的資料進行 [Region] = "East" 篩選。

注意

產生內嵌權杖時,需要提供使用者名稱,但使用者名稱可以是任何字串。 靜態角色有不相依於使用者名稱的定值,因此一旦 ISV 確定了使用者的角色並將其傳遞給內嵌權杖,無論傳遞了什麼使用者名稱,資料都會根據該角色進行篩選。

動態安全性

動態安全性使用 DAX 函式 (username()userprincipalname()) 定義角色。

使用者擁有資料的案例中,RLS 模型會根據特定使用者的角色自動篩選資料。 由於應用程式擁有資料,Power BI 不知道 ISV 客戶的使用者名稱,因此您可以使用 username() 函式動態篩選資料。

使用 username() 函式在 Power BI Desktop 中建立角色。 例如,您可以建立名為 CountryDynamic 的角色,並將其定義為 [CountryRegionCode] = username()

顯示如何建立動態 R L S 角色的螢幕擷取畫面。

假設您想讓您的使用者 jane@contoso.com 存取 France 的資料。 為 jane@contoso.com 產生內嵌權杖時,您將字串 France 作為 CountryDynamic 角色中的 username 傳遞。 您的資料已根據 [CountryRegionCode] = France 進行篩選。

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

在這種情況下使用動態安全性時,所有區域只需要一個角色。 區域名稱用作有效身分識別。

產生內嵌權杖

當您準備將報表内嵌至您的應用程式中時,您需要產生內嵌權杖。 若要使用內嵌權杖 API 產生權杖,請將以下資訊傳遞給 API。

  • username (必要) – 如果角色是動態的,則使用 username 字串作為篩選。 對於靜態角色,username 不影響 RLS,可以是任何字串。 只能列出單一使用者名稱。
  • 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 社群