Я пытаюсь встроить информационные панели PowerBI в мой клиентский портал MVC. У моих клиентов нет учетных записей AAD, поэтому они не могут войти в Live, когда заходят на веб-сайт, они входят на мой веб-сайт MVC с индивидуальными полномочиями.
Я зарегистрировал свое приложение в PowerBI/AAD и получил ClientID и Secret. Я звоню в AAD и получаю код авторизации, который затем использую для получения токена подтверждения, который успешно возвращается.
Когда я использую токен доступа для получения панели управления, он постоянно отклоняется с ошибкой 403 Forbidden.
Я просмотрел все образцы от Microsoft, но они требуют запроса на вход пользователя. Я просмотрел код ADAL2.0, который ссылается на метод AcquireToken, но он устарел в ADAL3 и заменен AcquireTokenAsync с другими параметрами, и я использую его в своем примере ниже.
Вот функция для получения токена:
protected AuthenticationResult GetAccessToken()
{
string pBiUser = Properties.Settings.Default.PowerBIUser;
string pBiPwd = Properties.Settings.Default.PowerBIPwd;
string pBiClientId = Properties.Settings.Default.PowerBIClientId;
string pBiSecret = Properties.Settings.Default.PowerBIClientSecret;
TokenCache TC = new TokenCache();
ClientCredential CC = new ClientCredential(pBiClientId,pBiSecret);
string AU = Properties.Settings.Default.PowerBIAuthority;
Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext authenticationContext
= new Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext(AU, TC);
AuthenticationResult result = authenticationContext.AcquireTokenAsync("https://analysis.windows.net/powerbi/api"
,CC).Result;
if (result == null)
{
throw new InvalidOperationException("Failed to obtain the PowerBI token");
}
return result;
}
Затем я беру токен результата и звоню. ответ получает ошибку 403:
protected PBIDashboards GetDashboards(AuthenticationResult authResult)
{
PBIDashboards pbiDashboards = new PBIDashboards();
var baseAddress = new Uri("https://api.powerbi.com");
using (var httpClient = new System.Net.Http.HttpClient {BaseAddress = baseAddress})
{
httpClient.DefaultRequestHeaders.TryAddWithoutValidation("authorization",
"Bearer " + authResult.AccessToken);
using (**var response** = httpClient.GetAsync("v1.0/myorg/dashboards").Result)
{
string responseData = response.Content.ReadAsStringAsync().Result;
//Deserialize JSON string
pbiDashboards = JsonConvert.DeserializeObject<PBIDashboards>(responseData);
if (pbiDashboards != null)
{
var gridViewDashboards = pbiDashboards.value.Select(dashboard => new
{
Id = dashboard.id,
DisplayName = dashboard.displayName,
EmbedUrl = dashboard.embedUrl
});
}
}
}
return pbiDashboards;
}