无法通过 Azure Powershell 在新应用程序注册模块中设置“preAuthorizedApplications”对象

yst*_*van 4 azure azure-powershell azure-active-directory adal.js

简短场景:多租户前端 javascript (React.JS) Web 应用程序从浏览器调用多租户 ASP.NET Core 2.2 WebAPI。

验证:

  1. 当用户登录时(基于用户的原始 Azure Active Directory),前端应用程序中的 ADAL.js 负责从 AzureAD1 或 AzureAD2 或 AzureAD3...获取令牌。

  2. 用户同意前端 Web 应用程序(范围:登录并读取用户配置文件),该应用程序也委托给 WebAPI。(这意味着用户也不需要同意 WebAPI

  3. 前端Web App使用不记名令牌调用We​​bAPI来获取资源。

问题:我必须自动部署新环境。并相应地设置清单文件(这是一个SaaS解决方案)

  1. 在清单文件中,我需要公开客户端应用程序的WebAPI(https://learn.microsoft.com/en-us/azure/active-directory/develop/quickstart-configure-app-expose-web-apis#expose -a-new-scope-through-the-ui
  2. 设置“knownClientApplications”是不够的(由于前面描述的委托
  3. 新的 v2 终结点 ( https://learn.microsoft.com/en-us/azure/active-directory/develop/v2-overview ) 具有新的应用程序注册功能。旧版本现在称为“Legacy”,将于 2019 年 5 月开始弃用。
  4. 在Azure门户中需要公开API并将前端WebApp添加为“授权的客户端应用程序”。

屏幕转储

此步骤将在清单文件中添加一个新对象:

"preAuthorizedApplications": [
        {
            "appId": "guid",
            "permissionIds": [
                "guid"
            ]
        }
    ],
Run Code Online (Sandbox Code Playgroud)
  1. 但仍然无法通过 PowerShell 使用!https://learn.microsoft.com/en-us/powershell/module/azuread/set-azureadapplication?view=azureps-2.0

如何使用 Azure PowerShell 将此“preAuthorizedApplications”部分添加到清单文件中?为什么门户网站上有,但PS上却没有?通常情况是相反的...

2019-08-05 根据答案更新:

我通过服务主体获取访问令牌:

$adTokenUrl = "https://login.microsoftonline.com/$TenantId/oauth2/token"
$resource = "https://graph.windows.net/"

$body = @{
    grant_type    = "client_credentials"
    client_id     = "$ServicePrincipalId"
    client_secret = "$ServicePrincipalKey"
    resource      = "$resource"
}

$response = Invoke-RestMethod -Method 'Post' -Uri $adTokenUrl -ContentType "application/x-www-form-urlencoded" -Body $body
$token = $response.access_token

Run Code Online (Sandbox Code Playgroud)

根据文档: https: //learn.microsoft.com/en-us/graph/api/application-update? view=graph-rest-beta&tabs=cs

服务主体应至少具有 Application.ReadWrite.OwnedBy 和大多数 Application.ReadWrite.All 权限。

我是否应该要求我们的 AAD 管理员向服务主体授予以下权限?

屏幕转储



2019 年 8 月 5 日更新 2:服务主体已被授予上述所有突出显示的权利。

尝试1:

第 1 步: 通过服务主体(要更新的 Api 应用程序的所有者)获取 access_token

$adTokenUrl = "https://login.microsoftonline.com/$(TenantId)/oauth2/token"
$resource = "https://graph.microsoft.com/"

$body = @{
    grant_type    = "client_credentials"
    client_id     = "$(ServicePrincipalId)"
    client_secret = "$(ServicePrincipalKey)"
    resource      = "$resource"
}

$response = Invoke-RestMethod -Method 'Post' -Uri $adTokenUrl -ContentType "application/x-www-form-urlencoded" -Body $body
$token = $response.access_token
Run Code Online (Sandbox Code Playgroud)

第 2 步:使用此 access_token,根据 Md Farid Uddin Kiron 的建议构建我的 PATCH 请求,以及

结果:远程服务器返回错误:(403) 禁止。

2019 年 9 月 5 日更新 3: 经过一些详细的解释和指导后,我让它工作并为我的 Postman 请求获取 HTTP 204。剩下的唯一一件事就是将这些步骤集成到我的管道中。

请参阅已接受的答案。有用。如果有人有同样的问题,请阅读 Md Farid Uddin Kiron 的其他答案。

Tec*_*ing 5

如果您想避免直接调用图形 API(也许您位于使用服务连接的天蓝色管道中并且无权访问凭据),您可以执行以下操作:

$AppName = << WebApp >>
$preAuthorizedApplicationsAppId = <<GUID>>

# Get the application and delegated permission to pre-authorize
$appRegistration = Get-AzureADMSApplication -Filter "displayName eq '$AppName'"
$oauth2Permission = $appRegistration.Api.OAuth2PermissionScopes | Where-Object {$_.Value -eq $AppName -and $_.Type -eq 'Admin'}

# Build a PreAuthorizedApplication object
$preAuthorizedApplication = New-Object 'Microsoft.Open.MSGraph.Model.PreAuthorizedApplication'
$preAuthorizedApplication.AppId = $preAuthorizedApplicationsAppId
$preAuthorizedApplication.DelegatedPermissionIds = @($oauth2Permission.Id)

$appRegistration.Api.PreAuthorizedApplications = New-Object 'System.Collections.Generic.List[Microsoft.Open.MSGraph.Model.PreAuthorizedApplication]'
$appRegistration.Api.PreAuthorizedApplications.Add($preAuthorizedApplication)

# Update the Application object
Set-AzureADMSApplication -ObjectId $appRegistration.Id -Api $appRegistration.Api
Run Code Online (Sandbox Code Playgroud)

这个答案来自这个GitHub问题