将主用户迁移到服务主体以在 power bi embedded 上进行身份验证

Migrating master user to service principal for authentication on power bi embedded

我正在尝试将我的身份验证方法从 Power BI 主用户迁移到服务主体。

我在主用户​​上使用 msal,身份验证流程如下所示: 登录 AAD --> 请求 AAD 令牌 --> 使用 AAD 令牌作为凭据

导入带有 rest API 的 pbix 文件

这是代码

$(document).ready(function () {
    myMSALObj.loginPopup(requestObj).then(function (loginResponse) {
        acquireTokenPopup();
    });
    Msal.UserAgentApplication
});

function acquireTokenPopup() {
    myMSALObj.acquireTokenSilent(requestObj).then(function (tokenResponse) {
        AADToken = tokenResponse.accessToken;
        importPBIX(AADToken);
    });
}

function importPBIX(accessToken) {
    xmlHttp.open("GET", "./importPBIX?accessToken=" + accessToken + "&pbixTemplate=" + pbixTemplate, true);
    //the rest of import process//
}

所以有两个问题: 1. 如果改用service principal会是怎样的流程? 在我的脑海中,从我从微软文档中读到的信息来看,它会更简单,比如: 使用应用程序密钥请求令牌 --> 使用令牌 API 导入 pbix 文件 这个对吗? 2. 我可以使用什么样的代码在 javascript 上执行此操作?我认为 MSAL 无法使用服务主体进行令牌请求。将不胜感激任何信息或教程。

最佳,

  1. what kind of flow would it be if I use service principal instead? on my head and from the info which I read from microsoft document it would be simpler like: request token using application secret key --> importing pbix file with rest API using token is this correct?

根据我的研究,如果你想使用服务主体来获取 Azure AD 访问令牌,你可以使用 client credentials grant flow

  1. 客户端应用程序向 Azure AD 令牌颁发端点进行身份验证并请求访问令牌。

  2. Azure AD 令牌颁发端点颁发访问令牌。

  3. 访问令牌用于对安全资源进行身份验证。

  4. 来自受保护资源的数据返回给客户端应用程序。

关于如何获取access token,请参考以下步骤

  1. 注册 Azure AD 应用程序

  2. 配置API权限

  3. 获取访问令牌

POST https://login.microsoftonline.com/<tenant id>/oauth2/token
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials
&client_id=<>
&client_secret=<>
&resource=https://analysis.windows.net/powerbi/api

2. what kind of code that I can use to do this on javascript?I think MSAL couldn't do token request by using service principal. would appreciate any info or tutorial for this.

如果你想用 sdk 实现客户端凭证授权流程,你可以使用 adal-node。详情请参考https://www.npmjs.com/package/adal-node.

例如

var AuthenticationContext = require('adal-node').AuthenticationContext;

var authorityHostUrl = 'https://login.microsoftonline.com/';
var tenant = 'myTenant.onmicrosoft.com'; // AAD Tenant name.
var authorityUrl = authorityHostUrl + '/' + tenant;
var applicationId = 'yourApplicationIdHere'; // Application Id of app registered under AAD.
var clientSecret = 'yourAADIssuedClientSecretHere'; // Secret generated for app. Read this environment variable.
var resource = ''; // URI that identifies the resource for which the token is valid.

var context = new AuthenticationContext(authorityUrl);

context.acquireTokenWithClientCredentials(resource, applicationId, clientSecret, function(err, tokenResponse) {
  if (err) {
    console.log('well that didn\'t work: ' + err.stack);
  } else {
    console.log(tokenResponse);
  }
});

多亏了 Jim 的回答,我稍微调整了我的代码,令牌身份验证过程进行得很顺利。 由于我的应用程序在前端使用 javascript 并在后端使用 python,因此我决定在 python 执行此过程并改用 python msal 库。 代码就像:

authority_host_uri = 'https://login.microsoftonline.com'
tenant = 'myTenantId'
authority_uri = authority_host_uri + '/' + tenant
client_id = 'myClienId'
client_secret = 'myClientSecretKey'
config={"scope":["https://analysis.windows.net/powerbi/api/.default"]}

app = ConfidentialClientApplication(client_id, client_credential=client_secret, authority=authority_uri)
token = app.acquire_token_for_client(scopes=config['scope'])

再次感谢 Jim 在这方面的帮助。

最佳,