【问题标题】:How to access Azure WebApp via Powershell using client secret如何使用客户端密码通过 Powershell 访问 Azure WebApp
【发布时间】:2020-02-03 14:01:34
【问题描述】:

我在 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?任何帮助将不胜感激。

【问题讨论】:

  • 尝试将 Authorization 标头的值替换为:“Bearer ey....”,其中 ey 是您的令牌
  • 授权令牌的值实际上是用'Bearer ey....'正确设置的,但仍然无法访问。令牌有效(使用 jwt.ms 检查)
  • 根据您的脚本,您不会在标头中获取令牌,您应该将 $Token 放在 $Headers 之前。
  • 嗨托尼,你完全正确!我的脚本的顺序确实正确,但在这篇文章中,我手动输入了命令,而且显然顺序错误,我的错。我将编辑我的帖子。

标签: azure powershell authentication web-applications


【解决方案1】:

是否有可能从 Powershell 访问 Azure WebApp 通过使用 SPN 进行身份验证?

是的,这是可能的。但是我们需要使用会话令牌(不是访问令牌)来访问应用程序资源。

使用访问令牌获取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

参考:

Validate tokens from providers

【讨论】:

  • 感谢 Tony Ju 提供这个脚本。只是一个小问题,我收到以下错误:invoke-RestMethod : {"message":"Missing id token. Unauthorized."} 在最后一次调用-RestMethod 期间。你知道如何解决它吗?谢谢
猜你喜欢
  • 1970-01-01
  • 2020-09-15
  • 1970-01-01
  • 2021-10-31
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-12
相关资源
最近更新 更多