sub*_*ule 7 powershell amazon-web-services amazon-iam aws-powershell
我想向现有用户发布临时凭证,以允许他们访问AWS管理控制台,方法是为他们提供使用这些临时凭证创建的URL.
我正在关注通过AWS文档给出的书面示例:使用IAM查询API的示例代码
我编写了以下代码,在执行时不会出现任何错误,并且似乎返回会话令牌,这样我就可以正确地形成一个URL来登录.
以下是返回会话令牌和后续URL的代码:
$accessKeyId = 'accesskeyId'
$secretAccessKey = 'secretaccessKey'
$region = 'us-east-1'
Set-AWSCredentials -AccessKey $accessKeyId -SecretKey $secretAccessKey
$role = Use-STSRole -RoleSessionName "testSTS" -RoleArn "arn:aws:iam::1234567890:role/adminAccess" -DurationInSeconds 900
$jsonSession = @"
{
"sessionId": $([string]::Format("{0}", $role.Credentials.AccessKeyId)),
"sessionKey": $([string]::Format("{0}", $role.Credentials.SecretAccessKey)),
"sessionToken": $([string]::Format("{0}", $role.Credentials.SessionToken))
}
"@
Add-Type -AssemblyName System.Web
$Encode = [System.Web.HttpUtility]::UrlEncode($jsonSession)
$url = $([string]::Format("https://signin.aws.amazon.com/federation?Action=getSigninToken&Session={0}", $Encode))
$payload = Invoke-WebRequest -Uri $url | ConvertFrom-Json
$issuer = [System.Web.HttpUtility]::UrlEncode("https://1234567890.signin.aws.amazon.com")
$destination = [System.Web.HttpUtility]::UrlEncode("https://console.aws.amazon.com")
$signintoken = [System.Web.HttpUtility]::UrlEncode($payload.SigninToken)
$signInUrl = $([string]::Format("https://signin.aws.amazon.com/federation?Action=login&Issuer={0}&Destination={1}&SigninToken={2}", $issuer, $destination, $signintoken))
write-host $signInUrl
Run Code Online (Sandbox Code Playgroud)
不幸的是,当我在网络浏览器中访问网址时,我收到以下错误"亚马逊网络服务登录:您的登录链接中的凭据无效.请与您的管理员联系."
这是我回复给我的网址的样子,显然我出于安全原因更改了accountid和real会话令牌:
另外,传递给我的凭据和sessiontoken似乎在使用它们发出API命令时起作用,如下面的代码所示:
$accessKeyId = 'accesskeyId'
$secretAccessKey = 'secretAccessKey'
$region = 'us-east-1'
Set-AWSCredentials -AccessKey $accessKeyId -SecretKey $secretAccessKey
$role = Use-STSRole -RoleSessionName "testSTS" -RoleArn "arn:aws:iam::1234567890:role/adminAccess" -DurationInSeconds 900
$newAccessKeyId = $role.Credentials.AccessKeyId
$newSecretKey = $role.Credentials.SecretAccessKey
$newSessionToken = $role.Credentials.SessionToken
Set-AWSCredentials -AccessKey $newAccessKeyId -SecretKey $newSecretKey -SessionToken $newSessionToken
$secgroups = Get-EC2SecurityGroup
Run Code Online (Sandbox Code Playgroud)
更新: 我尝试删除"issuer"参数,因为下面的文章将其列为可选项.我还尝试将"SessionType"添加到原始URL以请求sessiontoken,并且signin url仍然失败并出现相同的错误.
我找到了答案,不幸的是,结果并没有什么令人兴奋的!
违规代码似乎位于创建用于交换登录令牌的 JSON 会话字符串的部分。
我缺少键值对的双引号“”。
这是该代码的更新部分,供其他尝试使其工作的人使用!
$jsonSession = @"
{"sessionId": $([string]::Format('"{0}"', $role.Credentials.AccessKeyId)),
"sessionKey": $([string]::Format('"{0}"', $role.Credentials.SecretAccessKey)),
"sessionToken": $([string]::Format('"{0}"', $role.Credentials.SessionToken))}
"@
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
568 次 |
| 最近记录: |