Насколько я понимаю, у вас есть клиент c для входа в систему. Этот клиент будет вызывать API в функциональном приложении Azure, а ваше функциональное приложение будет вызывать PowerBi для выполнения некоторых задач от имени пользователей, вошедших в систему на вашем клиенте publi c.
Во всем этом процессе вы следует зарегистрировать два приложения Azure AD:
1. Приложение для вашего publi c клиента. Вы должны предоставить ему делегированное разрешение на доступ к вашему приложению Azure, чтобы пользователи могли войти и получить доступ. токен для вызова вашего функционального приложения.
2. В приложении для вашего Azure функционального приложения вы должны предоставить ему делегированное разрешение, связанное с powerbi, чтобы оно могло вызывать powerbi apis от имени пользователей.
Поэтому, пожалуйста, выполните следующие шаги, чтобы завершить sh этот процесс:
1.На клиентской стороне войдите в систему и получите токен доступа, который запрашивает ресурсы для вашего функционального приложения.
2.Вызовите ваше функциональное приложение с этим токеном доступа, чтобы ваше функциональное приложение могло использовать от имени потока , чтобы получить токен доступа для вызова ресурсов powerbi. Я проверил этот процесс в простом консольном приложении, и он отлично работает для меня, и я думаю, что вам нужен код:
using Microsoft.IdentityModel.Clients.ActiveDirectory;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AzureADUserAssertion
{
class Program
{
static void Main(string[] args)
{
var functionClientId = "<function azure ad app id>";
var functionSecret = "<function azure ad app secret>";
var functionCred = new ClientCredential(functionClientId, functionSecret);
var access_token_from_client_side = "<access token value>";
var context = new AuthenticationContext("https://login.windows.net/common/");
var res = context.AcquireTokenAsync("https://analysis.windows.net/powerbi/api",
functionCred, new Microsoft.IdentityModel.Clients.ActiveDirectory.UserAssertion(access_token_from_client_side, "urn:ietf:params:oauth:grant-type:jwt-bearer")).ConfigureAwait(false).GetAwaiter().GetResult();
Console.WriteLine( res.AccessToken );
Console.ReadKey();
}
}
}
Результат:
Проверьте этот токен:
Надеюсь, это поможет.