简短场景:多个租户前端javascript(React.JS)Web应用程序从浏览器调用多租户ASP.NET Core 2.2 WebAPI。
验证方式:
前端应用程序中的ADAL.js负责在用户登录时(根据用户原始的Azure Active Directory)从AzureAD1或AzureAD2或AzureAD3获取令牌。
用户也同意将其委派给WebAPI 的前端Web App(范围:登录并阅读用户个人资料)。(这意味着用户也不需要同意WebAPI)
前端Web应用程序使用承载令牌调用WebAPI以获取资源。
问题:我必须自动化新环境的部署。并相应地设置清单文件(这是一个SaaS解决方案)
此步骤将在清单文件中添加一个新对象:
"preAuthorizedApplications": [
{
"appId": "guid",
"permissionIds": [
"guid"
]
}
],
如何使用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的其他答案。
没错,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,这就是为什么它不太危险的原因。
嗨@MdFaridUddinKiron!非常感谢您的建议!我将对此进行测试。作为一种变通方法我目前作为PS脚本的所有者将自己(有对象ID),当我创建AAD的应用程序,这样我就可以在Azure门户manually.What我的部署后相应作出必要的修改注意到
$AdAppScopeId
(我的所有应用程序的PermissionIds)都不相同。该$AdPreAuthAppId
是明确的,那就是应用程序的对象ID。但是我似乎找不到有关范围ID的任何文档。我现在猜到可以分配任何有效的GUID吗?刚刚找到它。在我的情况下,这是oauth2Permissions的ID。docs.microsoft.com/en-us/graph/api/resources/…
是的,你可以。让我知道您是否还有其他顾虑。
嗨@MdFaridUddinKiron!我终于测试了。不幸的是,有一个例外:远程服务器返回错误:(405)不允许的方法。似乎不允许使用PATCH动词?
嗨,这很奇怪...我在2个租户中测试了上面的脚本,它适用于所有人。实际上,我正在调用此Graph API:docs.microsoft.com/en-us/graph/api / ... 如您所见,仅支持PATCH方法...您能否进行检查?如果成功调用了API,它将回复204:无内容