Azure云外壳中的AcquireTokenAsyn

时间:2019-07-03 04:31:27

标签: azure powershell azure-cloud-shell

我正在尝试从AZure CloudShell进行一些图形API调用。要进行API调用,我必须获得一个令牌。我在Azure桌面版本(PSVersion 5.1)中有100%的工作代码 但是相同的代码在运行(Core-6.2)的CloudShell中不起作用

Cloudshell库与文档存在一些不匹配的情况

我正在尝试使用此版本的AcuireTokenAsync

我必须为此初始化PlatmforParameter 但是当我遇到错误

  

$ platformParameters =新对象   “ Microsoft.IdentityModel.Clients.ActiveDirectory.PlatformParameters”   “自动”新对象:找不到“ PlatformParameters”的重载   参数计数为“ 1”。在线:1字符:23   + ...参数=新对象“ Microsoft.IdentityModel.Clients.ActiveDirecto ...   + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~   + CategoryInfo:InvalidOperation:(:) [New-Object],MethodException   + FullyQualifiedErrorId:ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand

似乎PlatformParameters不接受arg构造函数

这是我在Powershell Desktop 5.1版本中的工作代码

    $clientId = "1950a258-227b-4e31-a9cf-717495945fc2"  # well-known client ID for AzurePowerShell
    $redirectUri = "urn:ietf:wg:oauth:2.0:oob" # redirect URI for Azure PowerShell

    $resourceAppIdURI = "https://graph.windows.net"
    $authContext = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext" -ArgumentList $authority
    $platformParameters = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.PlatformParameters" -ArgumentList 'Auto'
    $authResultTask = $authContext.AcquireTokenAsync($resourceAppIdURI, $clientId, $redirectUri, $platformParameters)
    $authResultTask.Wait()
    $authResult = $authResultTask.Result

但是相同的代码在CloudShell中不起作用

是否有从Azure云外壳获取令牌的众所周知的变体

1 个答案:

答案 0 :(得分:1)

  

我想通过Powershell脚本自动化应用程序的创建和配置

如评论中所述,无需手动调用MS Graph API,您可以通过AzureAD powershell模块使它们自动化,该模块在云外壳中也可用。

示例:

1. 创建应用程序-New-AzureADApplication

New-AzureADApplication -DisplayName "My new application"  -IdentifierUris "http://mynewapp.contoso.com"

2. 更新应用程序-Set-AzureADApplication

例如,设置应用程序的API权限。

$req = New-Object -TypeName "Microsoft.Open.AzureAD.Model.RequiredResourceAccess"
$acc1 = New-Object -TypeName "Microsoft.Open.AzureAD.Model.ResourceAccess" -ArgumentList "311a71cc-e848-46a1-bdf8-97ff7156d8e6","Scope"
$acc2 = New-Object -TypeName "Microsoft.Open.AzureAD.Model.ResourceAccess" -ArgumentList "aaff0dfd-0295-48b6-a5cc-9f465bc87928","Role"
$req.ResourceAccess = $acc1,$acc2
$req.ResourceAppId = "00000002-0000-0000-c000-000000000000"

$reqe = New-Object -TypeName "Microsoft.Open.AzureAD.Model.RequiredResourceAccess"
$acc1e = New-Object -TypeName "Microsoft.Open.AzureAD.Model.ResourceAccess" -ArgumentList "ddb3ca45-a192-477d-acb2-46bf9dc586de","Scope"
$acc2e = New-Object -TypeName "Microsoft.Open.AzureAD.Model.ResourceAccess" -ArgumentList "28379fa9-8596-4fd9-869e-cb60a93b5d84","Role"
$reqe.ResourceAccess = $acc1e,$acc2e
$reqe.ResourceAppId = "00000009-0000-0000-c000-000000000000"

Set-AzureADApplication -ObjectId <ObjectId> -RequiredResourceAccess @($req,$reqe)

我在本地和云外壳中测试了脚本,都可以正常工作。如果您有其他要求,只需查看Azure AD PowerShell doc,您就可以通过此模块完成与AAD相关的大多数事情。

有关该示例的更多详细信息,可以引用两个链接12