Powershell - 使用Powershell对Azure AD应用程序执行“授予权限”操作

时间:2017-11-17 08:17:59

标签: powershell azure azure-active-directory microsoft-graph

我正在使用AzureAD模块创建一个Azure AD应用程序来调用Microsoft Graph API。我可以成功生成访问令牌。但是,当我尝试调用API时,我有一个错误“消息”:“无效的范围声明/角色。”。

当我在Azure门户中创建的应用程序中单击“授予权限”按钮并重试对API的调用时,该呼叫正在运行。

我没有找到任何地方如何使用Powershell执行此“授予权限”操作。有没有办法做到这一点?

由于

达明

4 个答案:

答案 0 :(得分:4)

有一种简单的方法(作为管理员),它要求您为Powershell安装AzureAD和AzureRM模块,并且不受Microsoft支持。

我的博客的原始帖子/参考位于:http://www.lieben.nu/liebensraum/2018/04/how-to-grant-oauth2-permissions-to-an-azure-ad-application-using-powershell-unattended-silently/

应该帮助您完成此任务的特定代码示例:

Function Grant-OAuth2PermissionsToApp{
Param(
    [Parameter(Mandatory=$true)]$Username, #global administrator username
    [Parameter(Mandatory=$true)]$Password, #global administrator password
    [Parameter(Mandatory=$true)]$azureAppId #application ID of the azure application you wish to admin-consent to
)

$secpasswd = ConvertTo-SecureString $Password -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential ($Username, $secpasswd)
$res = login-azurermaccount -Credential $mycreds
$context = Get-AzureRmContext
$tenantId = $context.Tenant.Id
$refreshToken = @($context.TokenCache.ReadItems() | where {$_.tenantId -eq $tenantId -and $_.ExpiresOn -gt (Get-Date)})[0].RefreshToken
$body = "grant_type=refresh_token&refresh_token=$($refreshToken)&resource=74658136-14ec-4630-ad9b-26e160ff0fc6"
$apiToken = Invoke-RestMethod "https://login.windows.net/$tenantId/oauth2/token" -Method POST -Body $body -ContentType 'application/x-www-form-urlencoded'
$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"
Invoke-RestMethod -Uri $url -Headers $header -Method POST -ErrorAction Stop
}

答案 1 :(得分:1)

我遇到了相同的错误'Refresh token is malformed'。读取刷新令牌时,令牌在字符串中两次。通过添加

行来解决
$refreshtoken = $refreshtoken.Split("`n")[0]

答案 2 :(得分:0)

如果我没错,那就是使用“管理员同意”。在这种情况下,您应该直接在auth请求中使用&prompt=admin_consent

如果您的应用程序请求仅限应用程序权限并且用户尝试登录该应用程序,则会显示一条错误消息,指出该用户无法同意。

权限是否需要管理员同意由发布资源的开发人员确定,可以在资源的文档中找到。

链接:Multi-tenant App pattern

Azure AD Graph API和Microsoft Graph API的可用权限列表

Graph API Permission Scopes

Consent Framework

希望它有所帮助。

答案 3 :(得分:0)

此答案基于乔斯的答案。

Active Directory身份验证库不再使刷新令牌公开可用。可以在github/azure-powershell/7525中找到更多信息。

下面的修改后的代码段对我有用

Connect-AzAccount
$context = Get-AzContext
$tenantId = $context.Tenant.TenantId
Connect-AzureAD -TenantId $tenantId -AccountId $context.Account.Id

$appId = 'Your Application ID'
$token = [Microsoft.Azure.Commands.Common.Authentication.AzureSession]::Instance.AuthenticationFactory.Authenticate($context.Account, $context.Environment, $tenantId, $null, "Never", $null, "74658136-14ec-4630-ad9b-26e160ff0fc6")
$headers = @{
    'Authorization' = 'Bearer ' + $token.AccessToken
    '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/$appId/Consent?onBehalfOfAll=true"
Invoke-RestMethod -Uri $url -Headers $headers -Method POST -ErrorAction Stop