【问题标题】:Microsoft Graph API permission to patch Application修补应用程序的 Microsoft Graph API 权限
【发布时间】:2020-04-24 13:40:44
【问题描述】:

当使用https://graph.microsoft.com/.default API 修补 Azure AD 中的应用程序时,它会失败并出现以下错误:

"code": "Authorization_RequestDenied",
"message": "权限不足,无法完成操作。", ...

调用通过应用程序权限进行身份验证,并配置以下内容:Application.ReadWrite.AllDirectory.ReadWrite.All

$uri = "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token";
$resourceUrl = 'https://graph.microsoft.com/.default'

$body = @{ grant_type='client_credentials';client_id=$clientId;client_secret=$clientSecret;scope=$resourceUrl; }
$result = Invoke-RestMethod -Method Post -Uri $uri -Body $body
$accessToken = $result.access_token
$authHeader = "Bearer $accessToken"

$patchBody = '{
  "displayName" : "dev2"
}'

Invoke-RestMethod -method PATCH -Uri https://graph.microsoft.com/v1.0/applications/$($app.Id) -Body $patchBody -ContentType application/json -Headers @{Authorization = $AuthHeader }

这里是 API 权限:

注意:我确实有权对应用程序执行 GET 操作。

有可能实现吗?

【问题讨论】:

    标签: powershell azure-active-directory azure-ad-graph-api


    【解决方案1】:

    应用权限Application.ReadWrite.All就够了,一定要在Microsoft Graph授权,而不是Azure Active Directory Graph,别忘了点击Grant admin consent按钮。

    在您的脚本中,您不应在最后一行传递$body$body 用于获取访问令牌。并确保这部分$($app.Id) 是应用程序的ObjectId

    $body = @{ grant_type='client_credentials';client_id=$clientId;client_secret=$clientSecret;scope=$resourceUrl; }
    
    Invoke-RestMethod -method PATCH -Uri https://graph.microsoft.com/v1.0/applications/$($app.Id) -Body $body -ContentType application/json -Headers @{Authorization = $AuthHeader }
    

    您需要使用此链接中的正文Update application - Request body,可以将其存储在.json文件中,然后使用Get-Content获取。

    在我的示例中,我更新了appRoles,您可以参考如下。

    patch.json 文件:

    {
     "appRoles": [
       {
        "allowedMemberTypes": [
          "User"
        ],
        "description": "Creators can create Surveys",
        "displayName": "SurveyCreator",
        "id": "1b4f816e-5eaf-48b9-8613-7923830595ad",
        "isEnabled": false,
        "value": "SurveyCreator"
      }
     ]
    }
    

    脚本

    $uri = "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token";
    $resourceUrl = 'https://graph.microsoft.com/.default'
    
    $body = @{ grant_type='client_credentials';client_id=$clientId;client_secret=$clientSecret;scope=$resourceUrl; }
    $result = Invoke-RestMethod -Method Post -Uri $uri -Body $body
    $accessToken = $result.access_token
    $authHeader = "Bearer $accessToken"
    
    $body1 = Get-Content -Path "C:\Users\joyw\Desktop\patch.json"
    
    Invoke-RestMethod -method PATCH -Uri https://graph.microsoft.com/v1.0/applications/<Object-id> -Body $body1 -ContentType application/json -Headers @{Authorization = $AuthHeader }
    

    运行命令后,可以使用GET方法查看结果。

    Invoke-RestMethod -method GET -Uri https://graph.microsoft.com/v1.0/applications/<Object-id> -ContentType application/json -Headers @{Authorization = $AuthHeader }
    

    更新:

    如果你用这个作为body,它也可以工作。

    $patchBody = '{
      "displayName" : "dev2"
    }'
    

    【讨论】:

    • 感谢您的回复。我在 Microsoft Graph 中使用 Application.ReadWrite.All,在 PATCH 正文中使用 JSON,尽管我在原始代码 sn-p 中错过了它。我收到访问错误。
    • @user3167162 查看我的更新。错误现在修复了吗?
    • @user3167162 您能否显示您的 AD 应用程序的 API permissions 页面,该页面用于获取问题中的令牌?
    • 当然,我在问题中添加了它。
    • @user3167162 权限是对的。您能否解码jwt.io 中的令牌,并查看Application.ReadWrite.All 是否包含在roles 中?参考截图-i.stack.imgur.com/fcuer.png
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 2022-11-11
    相关资源
    最近更新 更多