0

我正在尝试将身份验证方法从 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.如果我使用服务主体,会是什么样的流程?在我的脑海中以及从我从微软文档中读取的信息中,它会更简单,例如:使用应用程序密钥请求令牌->使用令牌导入带有rest API的pbix文件这是正确的吗?2. 我可以使用哪种代码在 javascript 上执行此操作?我认为 MSAL 无法使用服务主体进行令牌请求。将不胜感激任何信息或教程。

最好的,

4

2 回答 2

4
  1. 如果我改用服务主体,会是什么样的流程?在我的脑海中以及从我从微软文档中读取的信息中,它会更简单,例如:使用应用程序密钥请求令牌->使用令牌导入带有rest API的pbix文件这是正确的吗?

根据我的研究,如果要使用服务主体获取 Azure AD 访问令牌,可以使用客户端凭据授予流程 在此处输入图像描述

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

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

  3. 访问令牌用于对受保护的资源进行身份验证。

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

关于如何获取访问令牌,请参考以下步骤

  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. 我可以使用哪种代码在 javascript 上执行此操作?我认为 MSAL 无法使用服务主体进行令牌请求。将不胜感激任何信息或教程。

如果要使用 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);
  }
});
于 2020-01-21T05:40:31.047 回答
1

感谢 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 在这方面帮助我。

最好的,

于 2020-01-29T08:16:26.423 回答