简短的场景:多租户前端 javascript (React.JS) Web 应用程序从浏览器调用多租户 ASP.NET Core 2.2 WebAPI。
验证:
当用户登录时(基于用户的原始 Azure Active Directory),前端应用程序中的 ADAL.js 负责从 AzureAD1 或 AzureAD2 或 AzureAD3...获取令牌。
用户同意前端 Web 应用程序 (范围:登录并读取用户个人资料) 也委托给 WebAPI。 (这意味着用户也不需要同意 WebAPI)
前端Web App使用不记名令牌调用WebAPI来获取资源。
问题:我必须自动部署新环境。并相应地设置清单文件(这是一个SaaS解决方案)
- 在清单文件中,我需要公开客户端应用程序的 WebAPI (https://learn.microsoft.com/en-us/azure/active-directory/develop/quickstart-configure-app-expose-web-apis#expose-a-new-scope-through-the-ui)
- 设置“knownClientApplications”是不够的(由于先前描述的授权)
- 新的 v2 端点(https://learn.microsoft.com/en-us/azure/active-directory/develop/v2-overview)有一个新的应用程序注册功能。旧版本现在称为“Legacy”,将于 2019 年 5 月开始弃用。
- 在Azure门户中需要公开API并将前端Web应用程序添加为“授权客户端应用程序”。
![screendump](https://i.stack.imgur.com/OEmAF.jpg)
此步骤将在清单文件中添加一个新对象:
"preAuthorizedApplications": [
{
"appId": "guid",
"permissionIds": [
"guid"
]
}
],
-
但仍然无法通过 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
根据文档:
服务主体应至少具有 Application.ReadWrite.OwnedBy 和大多数 Application.ReadWrite.All 权限。
我是否应该要求我们的 AAD 管理员向服务主体授予以下权限?
![screendump](https://i.stack.imgur.com/p3Y6F.jpg)
2019 年 8 月 5 日更新 2:服务主体已被授予上述所有突出显示的权利。
尝试1:
Step 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,根据 Md Farid Uddin Kiron 的建议构建我的 PATCH 请求,以及
结果:远程服务器返回错误:(403) 禁止。
2019 年 9 月 5 日更新 3:经过一些详细的解释和指导后,我让它工作并为我的 Postman 请求获取 HTTP 204。剩下的唯一一件事就是将这些步骤集成到我的管道中。
查看已接受的答案。有用。如果有人有同样的问题,
请阅读 Md Farid Uddin Kiron 的其他答案。