Forum Discussion

avendanof's avatar
avendanof
Icon for Helper I rankHelper I
2 years ago
Solved

Bad request when embeeding an analisys services based report

I´m trying to  embeed a report based on a multidimensional cube in analisys services and I´m getting a bad request message. I´m testing it with the AppsOwnData application that is in here:    http...
  • avendanof's avatar
    2 years ago

    I´ve already came to the solution. 

    This is the idea:

     

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

    // Define the user identity and roles. Use one of the following:
    var rlsidentity = new EffectiveIdentity( // If no RLS
    username: "User", // can also be [email protected]
    datasets: new List<string> { datasetIds.First().ToString() }
    );


    // Create a request for getting an embed token for the rls identity defined above
    // This method works only with new Power BI V2 workspace experience
    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}
    );
    tokenRequest.Datasets.First().Validate(EffectiveIdentity);

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

    return embedToken;
    }

     

    The problem I've got now is how to detect if the dataset needs effective identity

  • avendanof's avatar
    avendanof
    2 years ago

    Inthe end, this is the solution

     

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

    // Define the user identity and roles. Use one of the following:
    //Los reportes no utilizan roles
    var rlsidentity = new EffectiveIdentity( // If no RLS
    username: "[email protected]", 
    datasets: new List<string> { datasetIds.First().ToString() }
    ); ;

    // Create a request for getting an embed token for the rls identity defined above
    // This method works only with new Power BI V2 workspace experience
    //controlo que se necesite EffectiveIdentity. Para los reportes paginados o los modelos tabulares no hace falta
    var dataset = pbiClient.Datasets.GetDatasetInGroup(targetWorkspaceId, datasetIds.First().ToString());
    if( dataset.IsEffectiveIdentityRequired == true) {

    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} //aquí es donde controlo

    );
    embedToken = pbiClient.EmbedToken.GenerateToken(tokenRequest);
    }
    else {
    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
    );
    embedToken = pbiClient.EmbedToken.GenerateToken(tokenRequest);
    }

     

    // Generate an embed token

    return embedToken;
    }