The ultimate Fabric, Power BI, SQL, and AI community-led learning event. Save €200 with code FABCOMM.
Get registeredEnhance your career with this limited time 50% discount on Fabric and Power BI exams. Ends August 31st. Request your voucher.
All,
WithIn the PowerBiClient SDK I want to update / set a Row-level Security roles.
The Group will then be visible in underlying screen.
Thanks in advance
Solved! Go to Solution.
This cannot be done by the PowerBIClient SDK.
For now I have the following solution. It's not nice, but it works. based on the Microsoft.AnalysisServices.Tabular lib.
public async Task SetRowLevelSecurity(string groupName, string datasetId, Guid domainGroupId, string domainName, string tenantId)
{
_authenticationResult ??= await GetAccessToken();
var dataSource = $"powerbi://api.powerbi.com/v1.0/{domainName}/{groupName}";
using var server = new Server();
server.Connect($"DataSource={dataSource};Password={_authenticationResult.AccessToken}");
var database = server.Databases.Find(datasetId) ?? throw new NullReferenceException(_cannotFindDataSet);
// Cast is needed otherwise the loading does not work
var model = (Model)database.Model;
var role = model.Roles.Find(<RoleName>);
if (role is not null)
{
var memberName = $"obj:{domainGroupId}@{tenantId}";
var member = role.Members.FirstOrDefault(m => m.Name.Contains(memberName, StringComparison.OrdinalIgnoreCase));
if (member is not null)
{
return;
}
role.Members.Add(new ExternalModelRoleMember
{
MemberName = memberName,
MemberType = RoleMemberType.Group,
IdentityProvider = "AzureAD"
});
database.Model.SaveChanges();
logger.LogInformation("Row Level Security set for {GroupId} for dataset {DataSetId}", domainGroupId, datasetId);
}
}
This cannot be done by the PowerBIClient SDK.
For now I have the following solution. It's not nice, but it works. based on the Microsoft.AnalysisServices.Tabular lib.
public async Task SetRowLevelSecurity(string groupName, string datasetId, Guid domainGroupId, string domainName, string tenantId)
{
_authenticationResult ??= await GetAccessToken();
var dataSource = $"powerbi://api.powerbi.com/v1.0/{domainName}/{groupName}";
using var server = new Server();
server.Connect($"DataSource={dataSource};Password={_authenticationResult.AccessToken}");
var database = server.Databases.Find(datasetId) ?? throw new NullReferenceException(_cannotFindDataSet);
// Cast is needed otherwise the loading does not work
var model = (Model)database.Model;
var role = model.Roles.Find(<RoleName>);
if (role is not null)
{
var memberName = $"obj:{domainGroupId}@{tenantId}";
var member = role.Members.FirstOrDefault(m => m.Name.Contains(memberName, StringComparison.OrdinalIgnoreCase));
if (member is not null)
{
return;
}
role.Members.Add(new ExternalModelRoleMember
{
MemberName = memberName,
MemberType = RoleMemberType.Group,
IdentityProvider = "AzureAD"
});
database.Model.SaveChanges();
logger.LogInformation("Row Level Security set for {GroupId} for dataset {DataSetId}", domainGroupId, datasetId);
}
}
Hi @BartHuls
Please do raise your new thoughts in the ideas forum and upvote it so that it will be adressed by the Microsoft internal team.
Best Regards,
Community Support Team _ C Srikanth.
Not currently available in any of the APIs. If this is important to you please consider voting for an existing idea or raising a new one at https://ideas.fabric.microsoft.com
Is there a way to set this from the outside? how to a access a xmla endpoint
If this is important to you please consider voting for an existing idea or raising a new one at https://ideas.fabric.microsoft.com