如何使用Azure CLI创建作用域(az ad app)

3qpi33ja  于 2022-12-14  发布在  其他
关注(0)|答案(4)|浏览(161)

使用Azure CLI 2.x时,我无法在Azure AD门户中的公开API部分下找到“添加作用域”的方法。

我看到的是,如果在创建应用程序时传递--identifier-uri,则会自动设置APP ID URI和Scope:

`az ad app create --display-name "$appName" --identifier-uris "https://$tenantDomain/$appName" --reply-urls "$replyUrl" --oauth2-allow-implicit-flow true`

不是我期望的也不是我想要的
因此,我从create命令中删除了--identifier-urls,并手动添加了我想要的作用域。然后,我通过manifest看到了我在OAuth2 Permissions下寻找的内容,如下所示。我可以将它与一个新的guid一起放入manifest.json中,并以某种方式插入它吗?

哪个CLI命令支持定义作用域的显式支持?那么,添加客户端应用程序时,我需要选择定义的作用域,这是如何引用的?
文档非常稀疏,IMO。这个参考非常有帮助,但是这里没有提到添加作用域和客户端。https://learn.microsoft.com/en-us/cli/azure/ad?view=azure-cli-latest。对示例或文档的任何帮助都非常感谢。

n8ghc7c1

n8ghc7c11#

从2012年7月29日起,最新的Azure CLI命令“az ad app update”不再包含oauth2permissions。如果你尝试以上操作,你会很有希望找到这篇文章。这些权限在应用注册表上的新位置位于api.oauth2PermissionScopes,作为一个数组。
为了绕过这个问题,我使用了这篇文章中的几个项目的组合,并不得不获得创造性的Azure docs也仍然不正确。
如果你已经公开了一个现有的API,你必须禁用它才能修改作用域。如果你有一个新的应用注册,你可以直接应用这个,没有问题。希望这能帮助像我这样的人,因为应用注册方式的改变和清单的改变而导致自动化被破坏。如果你不知道应用注册的变化,我建议你复习一下。如果你已经走到这一步了,我想你已经复习过了。

# Add API Read Scope: 
$scopeGUID = [guid]::NewGuid()
$scopeJSONHash = @{
    adminConsentDescription="$apiName on $svrAppRegName"
    adminConsentDisplayName="$apiName on $svrAppRegName" 
    id="$scopeGUID"
    isEnabled=$true
    type="User"
    userConsentDescription="$apiName on $svrAppRegName"
    userConsentDisplayName="$apiName on $svrAppRegName"
    value="$apiName"
}
$azAppOID = (az ad app show --id $serverApplicationId | ConvertFrom-JSON).id
$accesstoken = (Get-AzAccessToken -Resource "https://graph.microsoft.com/").Token
$header = @{
    'Content-Type' = 'application/json'
    'Authorization' = 'Bearer ' + $accesstoken
}
$bodyAPIAccess = @{
    'api' = @{
        'oauth2PermissionScopes' = @($scopeJSONHash)
    }
}|ConvertTo-Json -d 3

#You can try az rest, I used Invoke-RestMethod though.
#$graphURL="https://graph.microsoft.com/v1.0/applications/$azAppOID" 
#az rest --method PATCH --uri $graphurl --headers $header --body $bodyAPIAccess

Invoke-RestMethod -Method Patch -Uri "https://graph.microsoft.com/v1.0/applications/$azAppOID" -Headers $header -Body $bodyAPIAccess
ovfsdjhp

ovfsdjhp2#

摘自本文Azure CLI: Create an Azure AD application for an API that exposes OAuth2 Permissions
可以使用az ad app update命令(请参阅文档)
然后,可以使用可选参数–set设置应用程序的属性
1.创建包含以下权限的oauth2-permissions.json

[
  {
    "adminConsentDescription": "Access CP Debug Desc",
    "adminConsentDisplayName": "Access CP Debug",
    "id": "85b8f1a0-0733-47dd-9af4-cb7221dbcb73",
    "isEnabled": true,
    "type": "Admin",
    "userConsentDescription": null,
    "userConsentDisplayName": null,
    "value": "Access"
  }
]

1.运行此脚本,它将创建应用程序,禁用现有作用域并添加新作用域:

# Create the app registration
APP_REG=$(az ad app create --display-name myapi --identifier-uris https://myapi)

# Get the app id
APP_ID=$(echo $APP_REG | jq -r '.appId')

# disable default exposed scope
DEFAULT_SCOPE=$(az ad app show --id $APP_ID | jq '.oauth2Permissions[0].isEnabled = false' | jq -r '.oauth2Permissions')
az ad app update --id $APP_ID --set oauth2Permissions="$DEFAULT_SCOPE"

# Create new scopes from file 'oath2-permissions'
az ad app update --id $APP_ID --set oauth2Permissions=@oauth2-permissions.json
cclgggtu

cclgggtu3#

在上述线程的帮助下,经过大量的反复试验和pretty useful link,我能够使用CLI脚本在Windows环境中添加作用域。PowerShell对Windows上的“jq”不满意,必须删除反勾号才能使其正常工作。现在我需要解决使用CLI添加preAuthorizedApplication的问题。

$userAccessScopeApi = '{
    "lang": null,
    "origin": "Application",        
    "adminConsentDescription": "Access CP Debug desc",
    "adminConsentDisplayName": "Access CP Debug",
    "id": "--- replaced in scripts ---",
    "isEnabled": true,
    "type": "Admin",
    "userConsentDescription": null,
    "userConsentDisplayName": null,
    "value": "Access"
}' | ConvertTo-Json | ConvertFrom-Json
`

Write-Host " -  1 read oauth2permissions"
#(az ad app show  --id $appid)
$appjson = (az ad app list --display-name $appName)         
$app = $appjson | ConvertFrom-Json
$oauth2Permissions = $app.oauth2Permissions
$oauth2Permissions[0].isEnabled = 'false'

$oauth2Permissionsjson = ConvertTo-Json -InputObject @($oauth2Permissions) 

Write-Host " -  2 disable oauth2Permission in Azure App Registration"
$oauth2Permissionsjson | Out-File -FilePath .\oauth2Permissionsold.json
az ad app update --id $appId --set oauth2Permissions=@oauth2Permissionsold.json

Write-Host " -  3 delete the default oauth2Permission"
az ad app update --id $appId --set oauth2Permissions='[]'

Write-Host " -  4 add the new scope required add the new oauth2Permissions values"
$oauth2PermissionsApiNew = $userAccessScopeApi | ConvertFrom-Json
$oauth2PermissionsApiNew[0].id = New-Guid
$oauth2PermissionsApiNew = ConvertTo-Json -InputObject @($oauth2PermissionsApiNew) 

# Write-Host "new oauth2permissions : " + $oauth2PermissionsApiNew" 
$oauth2PermissionsApiNew | Out-File -FilePath .\oauth2Permissionsnew.json
az ad app update --id $appId --set oauth2Permissions=@oauth2Permissionsnew.json

Write-Host " - Updated scopes (oauth2Permissions) for App Registration: $appId"`
5kgi1eie

5kgi1eie4#

正如A2AdminGuy提到的,不能再直接更新oauth2Permissions,但您仍然可以使用az ad app update
1.执行命令az ad app show --id $appClientId,您将看到oauth2PermissionScopes现在位于api内部:

"api": {
    "acceptMappedClaims": null,
    "knownClientApplications": [],
    "oauth2PermissionScopes": [],
    "preAuthorizedApplications": [],
    "requestedAccessTokenVersion": null
}

1.您需要更新api属性才能设置oauth2PermissionScopes

$apiScopeId = [guid]::NewGuid().Guid
$apiScopeJson = @{
    requestedAccessTokenVersion = 2
    oauth2PermissionScopes      = @(
        @{
            adminConsentDescription = "$AppName on $EnvironmentAbbrev"
            adminConsentDisplayName = "$AppName on $EnvironmentAbbrev"
            id                      = "$apiScopeId"
            isEnabled               = $true
            type                    = "User"
            userConsentDescription  = "$AppName on $EnvironmentAbbrev"
            userConsentDisplayName  = "$AppName on $EnvironmentAbbrev"
            value                   = "authenticate"
        }
    )
} | ConvertTo-Json -d 4 -Compress

$apiUpdateBody = $apiScopeJson | ConvertTo-Json -d 4

az ad app update --id $apiClientId --set api=$apiUpdateBody --verbose

可以删除--verbose参数,但有趣的是,update命令是对图形API的PATH请求。
由于这是一个PATH请求,您不需要总是发送整个api属性,您可以执行两个请求来更新不同的属性,而前一个请求不会受到影响。
1.以下是更新SPA redirectUris的方法:

$appSpaJson = @{
    redirectUris = @("http://localhost:3000")
} | ConvertTo-Json -d 3 -Compress
    
$appUpdateBody = $appSpaJson | ConvertTo-Json -d 4

az ad app update --id $appClientId --set spa=$appUpdateBody

相关问题