Cas de figure :
- Vous développez une application embarquant des éléments power BI, sur une capacité PowerBI Embeded / Premium
- Vous avez enregistré cette application sur un Azure Active Directory
- Vous utilisez un principal de service pour vous authentifier sur le service PowerBI depuis cette application
- Certains de vos rapports utilisent une connexion live sur un cube SSAS au travers d’une passerelle « Power BI Gateway »
- Votre cube implémente du RLS (Row level Security) et vous souhaitez depuis l’application transmettre l’EffectiveIdentity ou le CustomData (pas exemple pour le RLS)
Alors, vous devez donner à votre principal de service un droit spécifique sur la datasource représentant votre cube sur la gateway au sein du service PowerBI.
Ce droit s’intitule ReadOverrideEffectiveIdentity et sous-entend que votre application va prendre la main pour transférer elle-même l’effectiveIdentity ou le CustomData en bypassant le travail de la passerelle.
Ce droit ne peut-être octroyer que par un administrateur de votre locataire PowerBI et il peut l’être à un principal de service, un utilisateur ou un groupe de sécurité. L’action doit être réalisée via un appel aux API Power BI via l’action AddDataSourceUser.
Tout cela est détaillé et décrit dans la documentation fournie par Microsoft et l’API à utiliser est également documentée. Ayant éprouvé malgré tout quelques difficultés à réaliser cette étape voici un petit script Powershell et le détail sur chacun des paramètres requis :
#Import-Module -name microsoftpowerbimgmt
Connect-PowerBIServiceAccount
$headers = Get-PowerBIAccessToken
$gatewayId = ""
$dataSourceId = ""
$principalId = ""
#Get Existing rights
$URL = "https://api.powerbi.com/v1.0/myorg/gateways/$gatewayId/datasources/$dataSourceId/users"
$model = Invoke-RestMethod -Headers $headers -Uri $URL -Method GET
"Existing Rights : "
$model.value
#Set new rights for principal
$User1 = @{
identifier= "$principalId"
datasourceAccessRight= "ReadOverrideEffectiveIdentity"
principalType="App"
} | ConvertTo-Json
try{
Invoke-RestMethod -Headers $headers -Uri $URL -ContentType 'application/json' -Method POST -Body $User1
}
catch {
# Dig into the exception to get the Response details.
# Note that value__ is not a typo.
"catch"
Write-Host "StatusCode:" $_.Exception.Response.StatusCode.value__
Write-Host "StatusDescription:" $_.Exception.Response.StatusDescription
([System.IO.StreamReader]$_.Exception.Response.GetResponseStream()).ReadToEnd()
}
Reste à obtenir les valeurs pour les 3 paramètres.
Les deux premiers $gatewayId et $datasourceId s’obtiennent directement en parcourant votre service powerbi. Rendez vous sur la gestion de vos passerelles, dépliez celle qui contient la datasource pointant vers le cube et cliquez sur celle-ci.
L’url contient désormais l’identifiant de la passerelle (la valeur à donner à $gatewayId) et celui de la source de données (la valeur à donner à $datasourceId)
Concernant le troisième paramètre, il s’agit de l’identifiant du service principal et c’est là qu’il ne faut pas se perdre faute de recevoir une exception peu bavarde du type « DMTS_PrincipalsAreInvalidError ».
Fin du suspense pour obtenir l’Id en question, rendez-vous sur le portail Azure et suivez ce chemin :
Azure Active Directory -> App Registration -> Votre application
Ensuite, cliquez à la pointe de la flèche :
Cliquez ensuite sur Properties, l’id à utiliser est l’objectId présenté sur cette page de propriétés.
L’exécution du script powershell vous permettra alors d’octroyer les droits requis. Un compte administrateur doit être utilisé pour se connecter lorsque le script vous dirige vers la connexion à PowerBI.