Получить токен доступа PowerBI с помощью UserAssertion - PullRequest
1 голос
/ 20 января 2020

У меня есть приложение Azure Function с включенной функцией Easy Auth. Я хочу получить токен доступа к power bi с разрешениями вошедшего в систему пользователя, чтобы пользователь мог получить прямой доступ к power bi из внешнего интерфейса. Я зарегистрировал приложение в Azure AD с разрешениями на power bi и создал конечную точку, запускаемую по протоколу HTTP, для возврата токена доступа во внешний интерфейс.

У меня нет имени пользователя или пароля в приложении функций, только идентификационный токен пользователя. Можно ли как-нибудь потребовать токен доступа для доступа к power bi от имени пользователя, использующего токен ID или UserAssertion?

Моя реализация здесь:

var context = new AuthenticationContext("https://login.windows.net/common/oauth2/authorize");

var res = await context.AcquireTokenAsync("https://analysis.windows.net/powerbi/api", 
clientId, new Microsoft.IdentityModel.Clients.ActiveDirectory.UserAssertion(idToken)).ConfigureAwait(false);

return new OkObjectResult(new { Token = res.AccessToken });

Но когда я пытаюсь чтобы запустить этот код, он бросает мне это исключение System.Private.CoreLib: Exception while executing function: GetPowerBiToken. Microsoft.IdentityModel.Clients.ActiveDirectory: AADSTS50027: JWT token is invalid or malformed.

Это правильный способ получения токена?

1 Ответ

1 голос
/ 21 января 2020

Насколько я понимаю, у вас есть клиент 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();

        }
    }
}

Результат: enter image description here

Проверьте этот токен:

enter image description here

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...