飙血推荐
  • HTML教程
  • MySQL教程
  • JavaScript基础教程
  • php入门教程
  • JavaScript正则表达式运用
  • Excel函数教程
  • UEditor使用文档
  • AngularJS教程
  • ThinkPHP5.0教程

【Azure 环境】用 PowerShell 调用 AAD Token, 以及调用Azure REST API(如资源组列表)

时间:2021-12-06  作者:lulight  

问题描述

PowerShell 脚本调用Azure REST API, 但是所有的API都需要进行权限验证。要在请求的Header部分带上Authorization参数,并用来对List Resource Group接口进行授权,然后显示Resource Group的Name,Location,和ID ...

问题解答

第一步:在Azure AD中注册应用,该应用表示执行PowerShell Script的客户端拥有访问Subscription下资源的权限。如无,则会出现 AuthorizationFailed 错误,详见附录一:权限问题

  1. 在浏览器上的新标签页中打开 Azure 门户。

  2. 导航到“应用注册”以在 Active Directory 中注册应用。

  3. 选择“新注册”。 在“注册应用程序”页上,将值设置如下:

    • 将“名称”设置为一个有意义的名称。 例如,powershell-client
    • 将“支持的帐户类型”设置为“仅限此组织目录中的帐户”。
    • 选择“注册” 。
  4. 注册应用程序之后,从“概述”页复制“应用程序(客户端) ID” 和 “ 目录 ”。

  5. 在边侧菜单的“管理”部分下,选择“证书和机密” 。

  6. 在“证书和机密”页中,选择“客户端机密”下的“新建客户端机密”按钮 。

    • 输入“说明”。
    • 为“过期”选择任一选项。
    • 选择“添加” 。
  7. 在离开页面之前复制客户端的“机密 ID”。 稍后脚本中需要用到此值。

第二步:在下面脚本中替换自己的 tenantId, applicationId secret

#===============================================
# 2021-11-14 通过Azure AD中的注册应用获取Access Token
# 
# Azure AD App Registrations: https://域名/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps
# 【Azure Developer】使用Postman获取Azure AD中注册应用程序的授权Token,及为Azure REST API设置Authorization: https://域名/lulight/p/域名
#===============================================


$tenantId=\'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\'
$applicationId=\'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\'
$secret=\'-xxxx~xxxxxxxxxxxxxxxxxxxxxxxx\'

$param = @{
    Uri ="https://域名/$tenantId/oauth2/token";
    Method = \'Post\';
    Body = @{
        grant_type = \'client_credentials\';
        resource = \'https://域名\';
        client_id = $applicationId;
        client_secret = $secret
    }
}

Write-Host \'调用Token接口 .. \' -ForegroundColor DarkYellow
$result = Invoke-RestMethod @param
$result


#===============================================
#
# 使用Token作为Authorization,调用Resource Groups - List: https://域名/en-us/rest/api/resources/resource-groups/list
#
#===============================================


$subscriptionId = \'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\'
$token = $域名ss_token

$param_rgList = @{
    Uri = "https://域名/subscriptions/$subscriptionId/resourcegroups?api-version=2020-06-01";
    ContentType = \'application/json\';
    Method = \'GET\'
    Headers = @{
        Authorization = "Bearer $token";
        host = "域名"
    }
}

Write-Host \'调用 Resource Groups - List 接口 .. \' -ForegroundColor DarkYellow
$rgList =  Invoke-RestMethod @param_rgList
$域名e | Select-Object name, location, id

执行结果:

 

附录一:权限问题

错误消息:

Invoke-RestMethod : {"error":{"code":"AuthorizationFailed","message":"The client \'0b807bf1-40db-4e0c-888f-380b9b558cf1\' with object id \'0b807bf1-40db-4e0c-888f-380b9b558cf1\' does not have authorization 
to perform action \'域名urces/subscriptions/resourcegroups/read\' over scope \'/subscriptions/a9dc7515-7692-4316-9ad4-762f383eec10\' or the scope is invalid. If access was recently granted, 
please refresh your credentials."}}
At line:49 char:12
+ $rgList =  Invoke-RestMethod @param_rgList
+            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (域名WebRequest:HttpWebRequest) [Invoke-RestMethod], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,域名域名keRestMethodCommand

错误截图:

解决办法:

在门户中进入Subscriptions页面,对注册应用赋予Reader权限即可。

1) 进入Azure Subscriptions页面:https://域名/#blade/Microsoft_Azure_Billing/SubscriptionsBlade

2) 选中订阅,在Access Control(iam)中对第一步中 AAD的注册应用赋予Reader权限。   

附录二:PowerShell中URL后携带参数的‘?’需要转义

因为PowerShell的变量名中后不能为符号,如 ? 等,需要添加 ` 作为转义字符(高亮部分),改为 \'?。

如:

$apiurl ="https://域名/.../$CloudServiceName?api-version=2015-06-01"

应修改为:

$apiurl ="https://域名/.../$CloudServiceName`?api-version=2015-06-01"

参考资料

Resource Groups - List:https://域名/en-us/rest/api/resources/resource-groups/list

Postman获取Azure AD中注册应用程序的授权Token,及为Azure REST API设置Authorization:https://域名/lulight/p/域名

标签:编程
湘ICP备14001474号-3  投诉建议:234161800@qq.com   部分内容来源于网络,如有侵权,请联系删除。