使用客户端凭据从Azure AD获取本机应用程序注册(PowerBI)的访问令牌

4

我正在使用adal4j(版本1.2.0)从后端应用程序获取访问令牌,以便能够使用PowerBI REST API嵌入报告(更具体地说,是GenerateToken方法)。我在Azure中注册了一个本机应用程序,并提供了必要的权限。我可以使用用户名/密码组合获取访问令牌,如下所示:

AuthenticationContext ac = new AuthenticationContext("https://login.windows.net/TENANT_ID/oauth2/authorize", false, es);
Future<AuthenticationResult> f = ac.acquireToken("https://analysis.windows.net/powerbi/api", CLIENT_ID, USERNAME, PASSWORD, null);

然后使用令牌成功地进行API身份验证,并最终显示嵌入式报告。但是,在我的情况下,我想当然地使用客户端凭据(客户端ID,客户端密钥)而不是用户帐户。我可以按以下方式再次获取令牌:

AuthenticationContext("https://login.windows.net/TENANT_ID/oauth2/authorize", false, es);
ClientCredential cc = new ClientCredential(CLIENT_ID, CLIENT_SECRET);
Future<AuthenticationResult> f = ac.acquireToken("https://analysis.windows.net/powerbi/api", cc,null);

客户端ID是注册本地应用程序的应用程序ID,客户端密码是通过向应用程序添加密钥来定义的。再次获取令牌,但现在我无法再使用它来对API进行身份验证(HTTP 403,没有进一步的详细信息)。
因此,我的问题是,这是一个应该起作用的有效场景吗?或者我是否缺少Azure或使用adal4j的技术信息?
编辑:下面是委派的应用程序权限的截图。

你检查了获取到的令牌吗?你可以使用像jwt.io这样的网站来检查它们的内容。但除非它与我之前使用它时有所改变,否则PBI REST API只允许委派调用。这意味着你必须在用户的上下文中运行它们。 - juunas
@juunas 感谢你的提示。我已经从认证结果中检查了令牌类型和过期时间,而且 jwt.io 显示两个令牌都是有效的。但是,使用用户名/密码组合生成的令牌在有效载荷中有更多与用户帐户相关的信息。这可能支持你的说法,即只允许委托调用。我将尝试获取相关报价,但如果这是真的,我想唯一的选择就是创建一个具有永不过期密码的专用帐户,这有点令人失望。 - Tuomas Tikka
如果应用程序专用身份验证为应用程序授予了某些角色(也称为应用程序权限),则令牌应包含角色。在委派调用中,令牌中有“作用域”(scp声明)。 - juunas
如果我是正确的,那么这实际上可能是一个许可问题。由于每个Power BI用户都需要一些许可证,如果您可以定义一个具有对每个用户工作区的完全访问权限的应用程序,从本质上绕过所有许可证要求,那将会有些棘手。 - juunas
@juunas 好的,我可以确认使用基于用户名的令牌的范围,但是在基于客户端的令牌中找不到角色(尽管它们在应用程序注册中定义)。至于许可证,我相信我们正在进入一个基于容量的模型,这是本月初刚刚宣布的。 - Tuomas Tikka
显示剩余3条评论
1个回答

6
据我所知,Power BI REST API仅支持委派权限,而不支持任何应用程序权限。您将在Azure门户中找不到任何应用程序权限。因此,Power BI REST API不允许在没有用户标识的情况下使用客户端凭据流。相关主题在这里在这里供您参考。
如果您想从服务连接到Power BI REST API,则可以使用资源所有者密码授权流程

是的,密码授权是唯一允许无人值守调用的授权方式。但是操作者必须确保密码不会过期,并且没有多重身份验证等限制。 - juunas
好的,谢谢,我认为我的关于有效场景的原始问题已经得到了回答。 - Tuomas Tikka
是的,正如@juunas所说,资源所有者流程有一些限制,您可以参考此博客了解更多详情。 - Nan Yu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接