首页 > 解决方案 > 如何使用客户端密码通过 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?任何帮助都感激不尽。

标签: azurepowershellauthenticationweb-applications

解决方案


是否甚至可以通过使用 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

参考:

验证来自提供者的令牌


推荐阅读