简体   繁体   English

通过 Az 模块创建 azure 应用程序并使用 powershell 分配 API 权限

[英]Create azure application through Az module and assign API permissions using powershell

I have written a script which creates azure application using Az module, creates secret key, assigns owner.我编写了一个脚本,它使用 Az 模块创建 azure 应用程序,创建密钥,分配所有者。 But assigning API permission gives insufficient permission error .但是分配 API 权限会导致权限insufficient permission error The user is an admin user.用户是管理员用户。 Still unable to assign API permission.仍然无法分配 API 权限。 What wrong am I doing?我在做什么错?

$ErrorActionPreference = 'Stop'
Connect-AzAccount
Import-Module Az.Resources
$tenant = Get-AzTenant
Set-AzContext -TenantId $tenant.Id
$AppName = Read-Host -Prompt 'Enter Application name '
$myApp = New-AzADApplication -DisplayName $AppName -IdentifierUris "http://$AppName.com"
Write-Host "App registered.."
$sp = New-AzADServicePrincipal -ApplicationId $myApp.ApplicationId -Role Owner
Write-Host "Service principal registered.."
$startDate = Get-Date
$endDate = $startDate.AddYears(100)
$secret = Read-Host -Prompt 'Enter App Secret Key ' -AsSecureString
$secPassword = ConvertTo-SecureString -AsPlainText -Force -String $secret
New-AzADAppCredential -ObjectId $myApp.ObjectId  -StartDate $startDate -EndDate $endDate -Password $secPassword

$ResourceAppIdURI = "https://graph.windows.net/"
# $authority = "https://login.microsoftonline.com/$tenant/oauth2/v2.0/token"
$authority = "https://login.windows.net/$tenant/oauth2/token"
$ClientCred = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.ClientCredential" -ArgumentList $myApp.ApplicationId, $secret
$AuthContext = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext" -ArgumentList $authority,$false
$AuthContext.TokenCache.Clear()
Start-Sleep -Seconds 10
$Token = $Authcontext.AcquireTokenAsync($ResourceAppIdURI, $ClientCred)

$AuthHeader = @{"Authorization" = $Token.Result.CreateAuthorizationHeader();"Content-Type"="application/json"}
$url = "https://graph.windows.net/$tenant/applications/$($myApp.ObjectID)?api-version=1.6"
Write-Host "URL: " $url

$postData = "{`"requiredResourceAccess`":[{`"resourceAppId`":`"00000003-0000-0000-c000-000000000000`",
`"resourceAccess`":[{`"id`":`"e1fe6dd8-ba31-4d61-89e7-88639da4683d`",`"type`":`"Scope`"}]}]}";
$result = Invoke-RestMethod -Uri $url -Method "PATCH" -Headers $AuthHeader -Body $postData
Write-Host "Result of App API permission: " $result

If you want to call Azure AAD graph API to assign permissions with OAuth 2.0 client credentials flow, we need to provide enough permissions(Azure AD Graph -> Aapplication permissions -> Application.ReadWrite.All )如果要调用 Azure AAD 图 API 以OAuth 2.0 客户端凭据流分配权限,我们需要提供足够的权限。

在此处输入图像描述

Besides, regarding how to assign permissions to AD application with PowerShell, we also can use PowerShell module AzureAD .此外,关于如何使用 PowerShell 为 AD 应用程序分配权限,我们还可以使用 PowerShell 模块AzureAD

For example例如

Connect-AzureAD
$AppAccess = [Microsoft.Open.AzureAD.Model.RequiredResourceAccess]@{
    ResourceAppId = "00000003-0000-0000-c000-000000000000";
    ResourceAccess =
        [Microsoft.Open.AzureAD.Model.ResourceAccess]@{
            Id = "";
            Type = ""},
        [Microsoft.Open.AzureAD.Model.ResourceAccess]@{
            Id = "";
            Type = ""}
}
Set-AzureADApplication -ObjectId <the app object id> -RequiredResourceAccess $AppAccess 

Update更新

According to my test, when we use Az module, we can use the following method to get access token and call AAD graph rest API.根据我的测试,当我们使用Az模块时,我们可以使用以下方法获取访问令牌并调用AAD图rest API。 But please note that when you use the method, the account you use to run Connect-AzAccount should be Azure AD Global Admin但请注意,当您使用该方法时,您用于运行Connect-AzAccount的帐户应该是 Azure AD Global Admin

Connect-AzAccount

$context =Get-AzContext
$dexResourceUrl='https://graph.windows.net/'
$token = [Microsoft.Azure.Commands.Common.Authentication.AzureSession]::Instance.AuthenticationFactory.Authenticate($context.Account, 
                                $context.Environment, 
                                $context.Tenant.Id.ToString(),
                                 $null, 
                                 [Microsoft.Azure.Commands.Common.Authentication.ShowDialog]::Never, 
                                 $null, $dexResourceUrl).AccessToken

# assign permissions
$headers =@{}
$headers.Add("Content-Type", "application/json")
$headers.Add("Accept", "application/json")
$headers.Add("Authorization", "Bearer $($token)")
$body = "{
`n    `"requiredResourceAccess`": [{
`n            `"resourceAppId`": `"00000003-0000-0000-c000-000000000000`",
`n            `"resourceAccess`": [
`n              {
`n                  `"id`": `"405a51b5-8d8d-430b-9842-8be4b0e9f324`",
`n                  `"type`": `"Role`"
`n              },
`n              {
`n                  `"id`": `"09850681-111b-4a89-9bed-3f2cae46d706`",
`n                  `"type`": `"Role`"
`n              }
`n          ]
`n        }
`n    ]
`n}
`n"
$url ='https://graph.windows.net/hanxia.onmicrosoft.com/applications/d4975420-841f-47d5-a3d2-0870901f13cd?api-version=1.6'
Invoke-RestMethod $url  -Method 'PATCH' -Headers $headers -Body $body

#check if adding the permissions you need
$headers =@{}
$headers.Add("Accept", "application/json")
$headers.Add("Authorization", "Bearer $($token)")
$url ='https://graph.windows.net/hanxia.onmicrosoft.com/applications/<aad application object id>?api-version=1.6'
$response=Invoke-RestMethod $url  -Method 'GET' -Headers $headers 
$response.requiredResourceAccess | ConvertTo-Json

在此处输入图像描述

In my case, the easiest way to do this without messing around with http requests, was to combine the Azure-powershell module and the Az cli module就我而言,在不搞乱 http 请求的情况下,最简单的方法是结合Azure-powershell模块和Az cli模块

So, once I have created my new app:所以,一旦我创建了我的新应用程序:

$myApp = New-AzADApplication -DisplayName $AppName -IdentifierUris "http://$AppName.com"

Then I would login into azure using the Az Cli , and, for instance:然后我会使用Az Cli登录 azure ,例如:

  • Add some api permissions添加一些 api 权限
  • Grant these permissions directory admin consent ( if needed )授予这些权限目录管理员同意(如果需要)
. { $azcliLogin = az login }
. { az account set --subscription $config.subscriptionId }
. { az ad app permission add --id $myApp.appid --api 00000002-0000-0000-c000-000000000000 --api-permissions 78c8a3c8-a07e-4b9e-af1b-b5ccab50a175=Role }
. { $appApiGrant = az ad app permission grant --id $config.azureAccess.appid --api 00000002-0000-0000-c000-000000000000 }
. { az ad app permission admin-consent --id $myApp.appid }

Where:在哪里:

--api 00000002-0000-0000-c000-000000000000 Refers to Microsoft Graph API --api 00000002-0000-0000-c000-000000000000指Microsoft Graph API

--api-permissions 78c8a3c8-a07e-4b9e-af1b-b5ccab50a175=Role Refers to some role on this api, as Directory.ReadWrite.All --api-permissions 78c8a3c8-a07e-4b9e-af1b-b5ccab50a175=Role指代此 api 上的某个角色,如 Directory.ReadWrite.All

You can get the required API and API-PERMISSIONS guids from the App manifiest in Azure您可以从 Azure 中的应用程序清单中获取所需的 API 和 API-PERMISSIONS 指南在此处输入图像描述

This way you create the app with the required granted api permissions, in a single powershell script.这样,您可以在单个 powershell 脚本中创建具有所需授予 api 权限的应用程序。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何使用 powershell Az 模块授予 Azure AD 应用程序访问所需权限的权限 - How to give Azure AD application access to required permissions using powershell Az module 使用 Azure Powershell(AZ 模块)为 Dynamics CRM Online 设置 Azure Ad Api 权限 - Setting Azure Ad Api permission for Dynamics CRM Online using Azure Powershell (AZ Module) 如何使用 Az 模块通过 PowerShell 获取 Azure 资源的 CPU 使用率 - How to get cpu usage of Azure resources through PowerShell with Az module macOS 上的 Azure Az PowerShell 模块 - Azure Az PowerShell module on macOS 如何使用 Az PowerShell 模块获取 Azure webapp config appsettings - How to get Azure webapp config appsettings using Az PowerShell module 无法在 linux 上安装 Azure Az PowerShell 模块 - Cannot install the Azure Az PowerShell module on linux 在 VM 上使用 az 安装程序 - 通过 azure powershell - Use the az installer on a VM - through azure powershell 如何使用资源管理API和Azure Java SDK向AD应用程序分配读写权限以管理资源 - How to assign read write permissions to an AD application to manage resources using resource management api with Azure java sdk 使用 az cli 为应用程序分配贡献者角色 - Assign contributor role to application using az cli 通过 PowerShell 检索 Azure AD 应用程序的“API 权限” - Retrieve "API Permissions" of Azure AD Application via PowerShell
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM