Amazon Cognito user poolの外部IdPとしてAzure ADを設定してみた

2022.03.14

こんにちは、CX事業本部 IoT事業部の若槻です。

Amazon Cognitoでは、user poolで管理しているユーザーだけでなく、SAML連携した外部のIdPで管理しているユーザーによるサインインを実装することも可能です。

今回は、Amazon Cognito user poolの外部IdPとしてMicrosoft Azure Active Directory(Azure AD)を設定してみました。

やってみた

こちらのドキュメントを参考にやっていきます。

(まだの場合)Cognito user poolおよびdomainの作成

下記エントリなどを参考に、Cognito user poolの作成およびCognito domainの設定を行っておきます。

この時、作成したCognito user poolの情報をもとに次の2つの値を作成しておきます。これらは次節で使用します。

  • Identifier (Entity ID):urn:amazon:cognito:sp:<userPoolID>
  • Reply URL:https://<domainPrefix>.auth.<aws-region>.amazoncognito.com/saml2/idpresponse

Azure ADへAmazon CognitoをEnterprise Applicationとして追加

Amazon Cognito user poolをAzure ADにアプリケーションとして追加することにより、両者の間の信頼関係を確立します。

AzureポータルでHome > Azure Active Directory > Enterprise applicationsで、[New application]をクリック。

[Create your own application]をクリック。

[What’s the name of your app?]でアプリ名を指定し、Integrate any other application you don’t find in the gallery (Non-gallery)を選択して、[Create]をクリック。

アプリが追加され、追加されたアプリケーションのOverviewページにリダイレクトされます。[2. Set up single sign on]の[Get started]をクリック。

[Select a single sign-on method]よりSAMLを選択。

[Set up Single Sign-On with SAML]で[Basic SAML Configuration]の[Edit]をクリック。

[Basic SAML Configuration]ペインが開くので、前節で控えた[Identifier (Entity ID)]と[Reply URL]をそれぞれ指定します。[Save]をクリックして保存します。

続いて[Attributes & Claims]の[Edit]をクリック。

[Add a group claim]をクリック。

[Group Claims]ペインが開くので、[Which groups associated with the user should be returned in the claim?]でGroups assigned to the applicationを選択し、[Save]をクリックして保存します。

追加されたClaimのClaim nameを控えます。[X]で[Attributes & Claims]を閉じます。

[Set up Single Sign-On with SAML]で[SAML Signing Certificate]の[App Federation Metadata Url]をコピーして控えます。

Amazon CognitoへAzure ADをSAML IdPとして追加

AWS CLIのadd-custom-attributesコマンドを使用して、Cognito user poolに適当なカスタム属性を追加します。この属性はCognitoに登録されたSAML IdPがAzure ADからグループメンバーシップの詳細を受け取る用途で使用されます。

$ userPoolId=<ユーザープールID>
$ customAttributeName=attrForIdpRelation //適当なカスタム属性名

$ aws cognito-idp add-custom-attributes \
  --user-pool-id ${userPoolId} \
  --custom-attributes Name=${customAttributeName},AttributeDataType="String"

AWS CLIのcreate-identity-providerコマンドを使用して、Cognito user poolにAzure ADをSAML IdPして追加します。

$ IDProviderName=AzureAD //適当なIdP名
$ metadataURLCopiedFromAzureAD=<前節で控えたApp Federation Metadata Url>

$ aws cognito-idp create-identity-provider \
  --user-pool-id ${userPoolId} \
  --provider-name=${IDProviderName} \
  --provider-type SAML \
  --provider-details MetadataURL=${metadataURLCopiedFromAzureAD} \
  --attribute-mapping email=http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress,${customAttributeName}=http://schemas.microsoft.com/ws/2008/06/identity/claims/groups

SAML IdPを使用するclient appをuser poolへ追加

Azure ADをSAML IdP使用するclient appをCognito user poolへ追加します。

$ appClientName=<適当なアプリクライアント名>
$ callbackURL=<コールバックURL>

$ aws cognito-idp create-user-pool-client \
  --user-pool-id ${userPoolId} \
  --client-name ${appClientName} \
  --no-generate-secret \
  --callback-urls "http://localhost:3000" ${callbackURL} \
  --allowed-o-auth-flows code \
  --allowed-o-auth-scopes openid email\
  --supported-identity-providers ${IDProviderName} \
  --allowed-o-auth-flows-user-pool-client

Azure ADアプリケーションへのユーザーのアサイン

Azure ADアプリケーションを使用してサインインをさせたいユーザーをアサインします。

AzureポータルでHome > Azure Active Directory > Enterprise applicationsで、作成したアプリケーションを選択して開きます。

[Assign users and groups]をクリック。

[Add user/group]をクリック。

[Add Assignment]-[Users]で[None Selected]をクリックし、アプリケーションを使用してサインインさせたいユーザーを一覧から選択し、[Select]をクリック。

[Assign]をクリック。

これでユーザーをアサインできました。

動作確認

AzureADによるSAML認証の動作確認をHosted UIのURLにアクセスして行ってみます。

Hosted UIはUserPool Clientのダッシュボードから開けますが、URLを手動作成することも可能です。

$ COGNITO_DOMAIN_NAME=<user pool domain作成時に指定したドメイン>
$ CLIENT_ID=<前節で作成したcliant appのID>
$ REDIRECT_URL=http%3A%2F%2Flocalhost%3A3000 //前節のclient app作成時に指定したコールバックURL
$ REGION=ap-northeast-1
$ ENDPOINT=${COGNITO_DOMAIN_NAME}.auth.${REGION}.amazoncognito.com/oauth2/authorize

$ echo "https://${ENDPOINT}?response_type=code&scope=email+openid&client_id=${CLIENT_ID}&redirect_uri=${REDIRECT_URL}"

作成したHosted UIのURLにアクセスすると、Azure ADの認証画面が開きました。前節でアサインしたユーザーのIDを指定して次へ進みます。

パスワードを指定して次へ進みます。

するとcorporate IDでのサインインを求められるので、Cognito user poolに登録したIdP名(今回はAzureAD)を選択します。

コールバックURLにリダイレクトされ、すでにlocalhost:3000として起動してあったwebアプリにアクセスできました!

ハマったところ

AADSTS50105エラー

Azure ADアプリケーションにアサインしていないユーザーでサインインをしようとするとAADSTS50105エラーが発生します。忘れずにアサインするようにしましょう。

以上