azure - 如何使用客户端密码通过 Powershell 访问 Azure WebApp
问题描述
我在 Azure 中创建了一个启用了 Azure 身份验证的 WebApp。这在使用用户进行身份验证时按预期工作。但是 WebApp 有一个特定的端点,除了发布 JSON 数据之外,它可以被解析并表示为图表。我想做的是发布由众多 Powershell 脚本收集的这些数据。如果我在用户帐户的上下文中运行 Powershell 脚本,我可以这样做,但我想使用 SPN 进行身份验证(因此使用应用程序 ID 和已设置的密钥)。这甚至可能吗?我已经尝试了下面的代码,它实际上确实获得了一个访问令牌,但是在发布请求的标头中发送它时,我得到一个
“您无权查看此目录或页面。”
错误信息。
$RequestAccessTokenUri = "https://login.microsoftonline.com/tenantID/oauth2/token"
$ClientId = "Application Id"
$ClientSecret = "Client Secret"
$Resource = "URL of the WebApp"
$body = "grant_type=client_credentials&client_id=$ClientId&client_secret=$ClientSecret&resource=$Resource"
$Token = Invoke-RestMethod -Method Post -Uri $RequestAccessTokenUri -Body $body -ContentType 'application/x-www-form-urlencoded'
$Headers = @{}
$Headers.Add("Authorization","$($Token.token_type) $($Token.access_token)")
$AppUri = $Resource + "/upload/post"
$json = <This will contain the actual JSON objects that will be posted>
invoke-RestMethod -Uri $AppUri -Method Post -Headers $Headers -body $json
是否甚至可以通过使用 SPN 进行身份验证从 Powershell 访问 Azure WebApp?任何帮助都感激不尽。
解决方案
是否甚至可以通过使用 SPN 进行身份验证从 Powershell 访问 Azure WebApp?
对的,这是可能的。但是我们需要使用会话令牌(不是访问令牌)来访问应用程序资源。
使用访问令牌获取authenticationToken。
要求:
POST https://<appname>.azurewebsites.net/.auth/login/aad HTTP/1.1
Content-Type: application/json
{"id_token":"<token>","access_token":"<token>"}
回复:
{
"authenticationToken": "...",
"user": {
"userId": "sid:..."
}
}
获得此会话令牌后,您可以通过将X-ZUMO-AUTH标头添加到 HTTP 请求来访问受保护的应用程序资源
GET https://<appname>.azurewebsites.net/api/products/1
X-ZUMO-AUTH: <authenticationToken_value>
这是工作的PowerShell脚本。
$RequestAccessTokenUri = "https://login.microsoftonline.com/{tenantId}/oauth2/token"
$ClientId = "{Application Id}"
$ClientSecret = "{client secret}"
$Resource = "{Application Id}"
$body = "grant_type=client_credentials&client_id=$ClientId&client_secret=$ClientSecret&resource=$Resource"
$Token = Invoke-RestMethod -Method Post -Uri $RequestAccessTokenUri -Body $body -ContentType 'application/x-www-form-urlencoded'
#get authentication token url
$RequestAuthenticationTokenUri="https://webapi-productsapp2093.azurewebsites.net/.auth/login/aad"
$bodystr = "{" + '"' + "access_token" + '"' + ":" + '"' + $Token.access_token + '"' + "}"
$authenticationToken=Invoke-RestMethod -Method Post -Uri $RequestAuthenticationTokenUri -Body $bodystr -ContentType 'application/json'
$Headers = @{}
$Headers.Add("X-ZUMO-AUTH",$authenticationToken.authenticationToken)
$website="http://webapi-productsapp2093.azurewebsites.net/api/products/1"
invoke-RestMethod -Uri $website -Method Get -Headers $Headers
参考:
推荐阅读
- java - 导致 NullPointerException 的片段布局视图
- angular - 从角度 6 中的数组中删除时检查循环中的验证(模板驱动形式)
- c++ - VS Code下调试基于bazel的C++项目
- java - 使用 Spring Boot Java 将文件写入安装在 AWS EC2 实例上的 Apache HTTPD 服务器
- javascript - 在while函数(nodejs)中运行mongodb函数时出错
- bash - 从列表中读取带有通配符的 url 并使用 lftp 下载
- amazon-web-services - 为什么在 Next.js 中发出请求时会有不同的主机头?
- javascript - JSX 中的 if 语句
- string - 在忽略大小写的情况下比较字符串的有效方法是什么?
- ruby-on-rails - 使用 pry 时立即在 Rails 控制台中同时评估多行代码?