この記事を参考にSalesforceからAWSにSAMLAssertionを投げて、AWSのコンソール画面にシングルサインオンするっていうのは出来たが、対象のRoleの一時的なAccessKeyIdやSecretAccessKeyを取得するためのAssumeRoleWithSAML のREST APIが通そうとしたところ、こんな感じのエラーが出てしまった。
<ErrorResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
<Error>
<Type>Sender</Type>
<Code>AccessDenied</Code>
<Message>Not authorized to perform sts:AssumeRoleWithSAML</Message>
</Error>
<RequestId>********-****-****-****-************</RequestId>
</ErrorResponse>
これはSSO用のロール作成で、[Grant Web Single Sign-On(WebSSO) access to SAML providers]のロールタイプを選んだ時に自動的に条件の”SAML:aud”にAWS ConsoleのSAML Endpointが設定されてしまうのが原因です。
"Condition": {
"StringEquals": {
"SAML:aud": "https://signin.aws.amazon.com/saml"
}
}
SalesforceでSAMLアサーションを使ってAssumeRoleWithSAMLをコールする場合は
- ACS URLにVisualforce Page等のURLをセットして
- 開始URLにアクセス→設定したVisualforce Pageに画面遷移(HTTP-POST)
- 呼び出されたVisualforce PageからAssumeRoleWithSAMLをコール
ということで、対象RoleのTrust Relationshipはこんな感じになります。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "1",
"Effect": "Allow",
"Principal": {
"Federated": "Input Your SAML Provider Arn"
},
"Action": "sts:AssumeRoleWithSAML",
"Condition": {
"StringEquals": {
"SAML:aud": "https://signin.aws.amazon.com/saml"
}
}
},
{
"Sid": "2",
"Effect": "Allow",
"Principal": {
"Federated": "Input Your SAML Provider Arn"
},
"Action": "sts:AssumeRoleWithSAML",
"Condition": {
"StringEquals": {
"SAML:aud": "Input Your SAML Visualforce Page(ACS URL)"
}
}
}
]
}
あるいは”SAML:iss”は”https://[MyDomain].my.salesforce.com”でどちらのケースも変わらないので、これを設定するだけでもOKです。