服务主体或Azure应用程序管理员是否可以同意外部多租户应用程序注册?

rsl1atfo  于 2023-06-30  发布在  其他
关注(0)|答案(1)|浏览(109)

我们管理着多个租户。目前,当我创建一个多租户应用程序注册,我需要一个接一个加载管理员同意URL在浏览器中,并登录为管理员在每个客户端(租户).这是一个冗长的过程。我曾经能够使用PowerShell和一个密码数据库来登录-AzurerMAccount,并获得一个刷新令牌在这个端点使用
“https://main.iam.ad.ext.azure.com/api/RegisteredApplications/$azureAppId/Consent?onBehalfOfAll=true”
在每个客户端批准应用程序。然而,现在有了MFA和强化的安全性,我不能再以管理员的身份以编程方式登录来批准每个租户上的应用程序。这就引出了我的问题。
我是否可以使用在每个客户端上创建的服务主体帐户,然后使用该帐户以编程方式登录,以批准该客户端的应用注册?还是只有一个普通的管理员帐户与用户名/密码允许批准的应用程序?
有人有这个过程的示例代码吗?
谢谢你

  • 执行的测试--
    我使用Directory.ReadWrite.All权限创建了一个应用程序注册。
    我测试了类似的代码和不同的变体,没有运气。我得到不同的错误取决于什么资源我输入
    Invoke-RestMethod:{“error”:“invalid_resource”,“error_description”:“AADSTS500011:在租户名称中找不到名为https://graph.microsoft.com/.default的资源主体

    Invoke-WebRequest:远程服务器返回错误:(401)未授权。
$body = @{
        grant_type    = "client_credentials"
        client_id     = $clientId
        client_secret = $clientSecret
        resource      = $resourceAppIdURI
    }
    $oauth = Invoke-RestMethod -Method Post -Uri https://login.windows.net/$tenantId/oauth2/token?api-version=1.0 -Body $body

 $header = @{
    'Authorization' = 'Bearer ' + $apiToken.access_token
    'X-Requested-With'= 'XMLHttpRequest'
    'x-ms-client-request-id'= [guid]::NewGuid()
    'x-ms-correlation-id' = [guid]::NewGuid()}
    $url = "https://main.iam.ad.ext.azure.com/api/RegisteredApplications/$azureAppId/Consent?onBehalfOfAll=true"
fhity93d

fhity93d1#

注意:要向Azure AD应用程序的API权限授予管理员同意,必须具有全局管理员、特权角色管理员或应用程序管理员角色。

我使用以下参数生成了访问令牌

https://login.microsoftonline.com/organizations/oauth2/v2.0/token

client_id:ClientID
client_secret:ClientSecret
scope:https://graph.microsoft.com/.default
grant_type:client_credentials

对于示例,我尝试使用以下Microsoft Graph查询授予管理员同意

POST https://graph.microsoft.com/v1.0/oauth2PermissionGrants

Request body
{
   "clientId": "ClientID",
   "consentType": "AllPrincipals",
   "resourceId": "ResourceID",
   "scope": "User.Read.All Group.Read.All"
}

401未授权**错误:

我是否可以使用在每个客户端上创建的服务主体帐户,然后使用该帐户以编程方式登录,以批准该客户端的应用注册?还是只有一个普通的管理员帐户与用户名/密码允许批准的应用程序?
尝试向应用程序授予应用程序管理员角色或任何所需角色,并尝试授予管理员权限。
使用Azure Service Principal使用az login登录,如下所示:

az login --service-principal -u "AppID" -p "ClientSecret" -t "TenantID"

现在生成访问令牌

az account get-access-token --resource https://graph.microsoft.com

使用以下Curl请求授予委托权限的管理员同意

curl --location --request POST 'https://graph.microsoft.com/v1.0/oauth2PermissionGrants'  \
--header 'Authorization: Bearer <bearertoken_ruk>' \  
--header 'Content-Type: application/json' \  
--data-raw '{  
"clientId": "ObjectIDofSP",  
"consentType": "AllPrincipals",   
"resourceId": "MsGraphID",  
"scope": "Group.ReadWrite.All"  
}

授予应用程序管理员同意权限,请使用以下命令:

POST https://graph.microsoft.com/v1.0/servicePrincipals/SpID/appRoleAssignedTo

{
   "principalId": "PrincipalID",
   "resourceId": "ResourceID",
   "appRoleId": "ID"
}

API权限管理员同意成功如下:

注意:可能需要几分钟的延迟才能在Portal中反映Admin Consent。
参考文献:

How to grant admin consent to an API programmatically | by Sahil Malik
Grant tenant-wide admin consent to an application - Microsoft Entra

相关问题