温馨提示:本文翻译自stackoverflow.com,查看原文请点击:其他 - Cannot set "preAuthorizedApplications" object in new App registrations module through Azure Powershe
azure azure-active-directory azure-powershell adal.js

其他 - 无法通过Azure Powershe在新的App注册模块中设置“ preAuthorizedApplications”对象

发布于 2020-04-13 18:25:00

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

验证方式:

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

  2. 用户也同意将其委派给WebAPI 的前端Web App(范围:登录并阅读用户个人资料)。这意味着用户也不需要同意WebAPI

  3. 前端Web应用程序使用承载令牌调用We​​bAPI以获取资源。

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

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

屏幕转储

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

"preAuthorizedApplications": [
        {
            "appId": "guid",
            "permissionIds": [
                "guid"
            ]
        }
    ],
  1. 但是它仍然无法通过PowerShell使用!https://docs.microsoft.com/zh-cn/powershell/module/azuread/set-azureadapplication?view=azureadps-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

根据文档:https : //docs.microsoft.com/zh-cn/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

第2步:使用此access_token,按照Farid Uddin Kiron的建议建立我的PATCH请求,并

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

2019年9月5日更新3: 经过某种详尽的解释和指导,我可以使用此功能并为我的 Postman 请求获取HTTP 204。剩下的就是将这些步骤集成到我的管道中。

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

查看更多

提问者
ystvan
被浏览
101
Md Farid Uddin Kiron 2019-05-08 09:25

没错,AzureAD powershell模块中似乎存在故障。那对我也不行。

如果要修改app manifest使用powershell来添加“ preAuthorizedApplications”部分,则可以尝试以下powershell脚本。

我已经测试过了,对我有用。

从理论上讲,我已经调用Microsoft Graph API来修改app manifest如果您还有其他疑问,请随时告诉我。

$AdAdminUserName = "<-your Azure ad admin username ->"

$AdAdminPass="<-your Azure ad admin password ->"

$AdAppObjId = "<-your app obj id->"

$AdPreAuthAppId = "<-the app that need to be pre authed ->"

$AdAppScopeId = "<-your app scope id->"

$tenantName = "<-your tenant name->"


$body=@{
    "grant_type"="password";
    "resource"="https://graph.microsoft.com/";
    "client_id"="1950a258-227b-4e31-a9cf-717495945fc2";
    "username"=$AdAdminUserName;
    "password" = $AdAdminPass
}

$requrl = "https://login.microsoftonline.com/"+$tenantName+"/oauth2/token" 

$result=Invoke-RestMethod -Uri $requrl -Method POST -Body $body 

$headers = New-Object 'System.Collections.Generic.Dictionary[String,String]'
$headers.Add("Content-Type","application/json")
$headers.Add("Authorization","Bearer " + $result.access_token)


$preAuthBody = "{`"api`": {`"preAuthorizedApplications`": [{`"appId`": `"" + $AdPreAuthAppId + "`",`"permissionIds`": [`"" + $AdAppScopeId + "`"]}]}}"

$requrl= "https://graph.microsoft.com/beta/applications/"+$AdAppObjId

Invoke-RestMethod -Uri $requrl -Method PATCH -Body  $preAuthBody  -Headers $headers

注意: ROPC不安全,因为Microsoft不建议使用ROPC。它也不允许使用MFA,这就是为什么它不太危险的原因。