【问题标题】:deamon authentication on powerapps admin REST APIpowerapps admin REST API 上的守护进程身份验证
【发布时间】:2021-06-18 06:00:55
【问题描述】:

在我们的 powerapps 使用情况的合规性监控应用程序的范围内,我们创建了一个 C# 控制台应用程序来抓取 powerapps。

  • 环境
  • 应用程序
  • 权限

(与Microsoft.PowerApps.Administration cmdlets提供的powershell命令Get-AdminPowerAppEnvironmentGet-AdminPowerApp类似的REST调用)

通过在连接到我的管理员 AAD 帐户时从提琴手那里窃取 Bearer 标头来完成概念验证。 POC 现在已经过验证,是时候清理它了。与 AAD 身份验证流程(对我而言)一样,它比预期的要复杂得多(尝试和失败的时间总和)。

我发现关于如何验证和抓取(这部分没问题)这个 API 的互联网参考资料非常少。

我尝试了不同的身份验证工作流程和库

  • MSAL
  • ADAL
  • powershell 命令之上的提琴手(但在 powershell 中我没有使用服务主体)

要么我找不到正确的范围,要么我的服务主体对资源没有权限。

  1. 我有一个名为AAA powerappsApp registration 具有...相当多的权限(尝试并失败)

  2. 创建了一个客户端密码

  3. 以防万一,输入 Power Apps 管理员

            string authority = $"https://login.microsoftonline.com/[tenant-guid]/";

            var app = ConfidentialClientApplicationBuilder
            .CreateWithApplicationOptions(new ConfidentialClientApplicationOptions {  ClientId = "[client-id]", ClientSecret = "[shhuuuu]" })
            .WithAuthority(authority).Build();

            // tried with https://management.azure.com/.default / https://api.bap.microsoft.com/.default / https://service.powerapps.com./default
            var token = app.AcquireTokenForClient(new[] { "https://management.azure.com/.default" }).ExecuteAsync().Result; 

            //var client = new RestClient("https://api.bap.microsoft.com/providers/Microsoft.BusinessAppPlatform/scopes/admin/environments?api-version=2016-11-01");
            var client = new RestClient("https://management.azure.com/providers/Microsoft.BusinessAppPlatform/scopes/admin/environments?api-version=2016-11-01");
            var request = new RestRequest(Method.GET);
            request.AddHeader("Authorization", "Bearer " + token.AccessToken);
            IRestResponse response = client2.Execute(request);

我得到一个令牌,但不幸的是,我认为它不在正确的范围/资源上。 根据范围,我要么得到

  • 禁止
{"error":
{"code":"Forbidden","message":"The service principal with id '[service principal guid (not client id)' 
for application <null> does not have permission to access the path 'https://api.bap.microsoft.com:11779/providers/Microsoft.BusinessAppPlatform/scopes/admin/environments?api-version=2016-11-01' in tenant [tenant-guid]."}}

  • 未经授权
{"error":{"code":"AuthenticationFailed","message":"Authentication failed."}}

【问题讨论】:

  • 我可以知道您的screenshot 中的“PowerApps 服务”资源是什么吗?我无法从我的 AAD 中找到它。如果它正是您尝试访问的资源,则应添加 Application Permission 而不是 Delegated Permission,因为服务主体使用 Application Permission。
  • 添加 powerapps 服务更像是一个绝望的举动测试。根据名为“api.bap.microsoft.com/providers/Microsoft.BusinessAppPlatform/…”的 REST 端点,我更认为实际的 API 是 Azure 服务管理。 “应用程序权限”相当委派是有道理的,但它是灰色的。我试图在清单中找到有关 appRoles 配置的文章,但我知道它仅适用于自定义 API,这不是我的情况。
  • 我认为这不是 Azure 服务管理。 Azure 服务管理用于调用 Azure 资源。通常我们可以给服务主体分配一个 RBAC 角色来给它应用权限。但 PowerApps 不会出现在 Azure 资源下。基于这个package,我看到了"api.bap.microsoft.com" = "https://service.powerapps.com/"。看起来 https://service.powerapps.com 是资源端点。但我仍然找不到我们可以为其分配权限的位置。
  • 从这个link我注意到大多数cmds都有cdscds 是通用数据服务。如果数据来自公共数据服务,您可以查看this post,这可能会有所帮助。它正在使用应用程序用户访问 PowerApps。
  • 对您提供的链接感兴趣,因此感觉从“常规”AAD 方式(应用注册等)切换到与 ADAL/identitymodel (XRM) 关联的“经典”非交互式管理员帐户.跟进您的链接,我发现了这个有趣的回购:github.com/microsoft/PowerApps-Samples/blob/master/cds/webapi/… 将检查是否可能从那里“窃取”正确的令牌。不幸的是,我将不得不等待,因为我们的帐户默认需要 MFA/2 身份验证,我需要戳我们的管理员。

标签: azure-active-directory powerapps


【解决方案1】:

使用client idclient secret 未成功,但设法使用AAD 用户调用api.bap.microsoft.com/../Microsoft.BusinessAppPlatform

例如https://api.bap.microsoft.com/providers/Microsoft.BusinessAppPlatform/scopes/admin/environments?api-version=2016-11-01

重复使用与Microsoft.PowerApps.Administration cmdlets相同的方法

  1. AAD 帐户与 AAD Power platform administrator role
  2. 如果为管理员启用了多因素访问,则创建例外规则
  3. 使用 ADAL nuget Microsoft.IdentityModel.Clients.ActiveDirectory
  4. 点网
AuthenticationContext authContext = new AuthenticationContext("https://login.windows.net/common");

var credentials = new UserPasswordCredential("admin_powerapps@domain.net", "password");

// "1950a258-227b-4e31-a9cf-717495945fc2" = client ID for Azure PowerShell.
// available for any online version
var token = authContext.AcquireTokenAsync("https://management.azure.com/", "1950a258-227b-4e31-a9cf-717495945fc2", credentials).Result;

// any REST call
Header "Authorization" : "Bearer " + token.AccessToken
Endpoint : https://api.bap.microsoft.com/providers/Microsoft.BusinessAppPlatform/scopes/admin/environments?api-version=2016-11-01

结果

这种方法的好处是它可以无缝地抓取“所有”环境(不确定在每个环境上创建用户的方法是否有效)。 我发现的另一种方法是使用Powerapps connector for admin,但它涉及每个环境的额外配置并且需要许可证。

不完全确定是否会长期支持此方法(例如 xx.windows.net)。对任何其他建议持开放态度。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。我解决的方法是使用此命令New-PowerAppManagementApp 在 Power Platform 管理员上注册具有租户管理员权限的应用程序。请找到 MSFT 文章here

    您的客户端应用程序在 Azure AD 中注册后,还需要在 Microsoft Power Platform 中注册。今天,没有办法通过 Power Platform 管理中心来做到这一点。它必须通过 Power Platform API 或 Power Platform 管理员的 PowerShell 以编程方式完成。服务主体不能注册自己——根据设计,应用程序必须由管理员用户名和密码上下文注册。这可确保应用程序是由租户管理员有意创建的。

    $appId = "CLIENT_ID_FROM_AZURE_APP"
    # Login interactively with a tenant administrator for Power Platform
    Add-PowerAppsAccount -Endpoint prod -TenantID $tenantId
    # Register a new application, this gives the SPN / client application same permissions as a tenant admin
    New-PowerAppManagementApp -ApplicationId $appId
    

    【讨论】:

      猜你喜欢
      • 2015-04-05
      • 1970-01-01
      • 1970-01-01
      • 2013-01-27
      • 2017-02-04
      • 2016-10-28
      • 1970-01-01
      • 1970-01-01
      • 2018-05-28
      相关资源
      最近更新 更多