【发布时间】:2019-03-05 07:37:57
【问题描述】:
如何使用 Powershell 在 Azure 身份验证后调用 API?
更具体地说,我确实希望这条线起作用:
Invoke-RestMethod -Method Get -Uri 'https://contoso.com/api/Hello
我的 API 是本地的(但在 Web 上可见)并且配置了 Azure AD 身份验证并且是强制性的。
我希望以编程方式通过 Powershell 进行身份验证,这样我就可以调用 API 而无需任何额外的交互。
目前,无论我做什么,我在执行Invoke-RestMethod 时都会遇到 401 错误。
关于 API
我正在使用通过 Visual Studio 创建的示例 asp.net core c# 应用程序(使用工作或学校身份验证方法)。 这个过程在 Azure 中创建了应用程序注册,我确实在 Azure 中手动创建了一个客户端密码。
我的尝试
现在,使用 Powershell,我填写了以下内容
$Params = @{
'client_id' = ''
'Redirect_URI' = ''
'TenantID' = ''
'response_type'='code'
}
$ClientSecret = ''
从那里,我确实得到了一个授权码:
$Query = "?"; $Params.Keys | % {$Query+= "$($_)=$($Params.Item($_))&"} ; $Query = $Query.TrimEnd('&')
$IE= new-object -ComObject "InternetExplorer.Application"
$IE.Visible = $true
$IE.navigate2("https://login.microsoftonline.com/$($params.TenantID)/oauth2/authorize$Query")
Write-Host 'Press enter when Code is displayed in URL'
pause
$Code = [System.Web.HttpUtility]::ParseQueryString(([uri]$ie.LocationURL).Query)['code']
$ie.quit()
最后,我使用以下方法获取访问令牌:
$TokenResult = Invoke-RestMethod -Method Post -ContentType 'application/x-www-form-urlencoded' -Uri "https://login.microsoftonline.com/$($Params.TenantID)/oauth2/v2.0/token" -Body @{
client_id = $Params.client_id
scope = 'User.Read offline_access'
code = $Code
redirect_uri = $Params.Redirect_URI
grant_type = 'authorization_code'
client_secret = $ClientSecret
}
但是,如果我现在尝试使用以下方式调用我的 API:
Invoke-RestMethod 'https://SomeDomain.com/api/values' -Headers @{Authorization = "Bearer $($TokenResult.access_token)"}
结果
我确实得到了未经授权的 401
我的观察
我相信我成功地使用了以下方法与 Graph API 和其他 Azure API 进行交互。但是,这在调用我自己的 Azure 身份验证背后的 API 时不起作用。
我应该如何进行适当的调用,以允许我使用 Azure 身份验证针对我的私有 API 进行身份验证?
【问题讨论】:
标签: azure powershell azure-active-directory