しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

App Service / Static Web Apps / Container Apps の Easy Auth が OpenID Connect の RP-Initiated Logout をサポート

App Service などに実装されている Easy Auth (Authentication) はアプリケーション側の修正をすることなく、Azure AD や任意の OpenID Connect に対応した IdP を使ったログインを追加できる非常に便利な機能です。

各 PaaS / Serverless 系サービスに実装されている Easy Auth の差異は以前にまとめているので、興味がある方はこちらを参照してください。思ったよりも違いがあります。

非常に便利な Easy Auth ですが、実際に使っている際によく問題となるのがログアウト時の挙動です。App Service からはログアウトしても IdP 側のログアウトが自動で行われないので、すぐにログイン状態に戻ってしまうので実質的にログアウトが不可能になります。

この挙動を改善するには IdP 側も同時にログアウトする必要があるので、OpenID Connect を利用している場合には RP-Initiated Logout を組み合わせることで対応可能でした。

Azure AD や Azure AD B2C は RP-Initiated Logout に対応しているので、OpenID Connect の Metadata を確認すると end_session_endpoint が含まれています。

以前に Easy Auth を使って OpenID Connect の RP-Initiated Logout を使う方法を書きましたが、手動でリダイレクト URL を組み立てる必要があり、エスケープ周りもまあまあ面倒でした。

手動での対応方法に興味がある方は以下のエントリを参照してください。

ようやく本題に入るのですが、これまでは IdP の同時ログアウトを諦めるか、ログアウト時の複雑な URL を手動で組み立てる必要がありましたが、少し前の Easy Auth Middleware のアップデートで RP-Initiated Logout に対応したので、独自対応が必要なくなりました。

OpenID Connect の Metadata に end_session_endpoint が定義されていれば、通常の /.auth/logout にアクセスすれば IdP 側にもリダイレクトしてログアウトされます。

そして Easy Auth にはサービス毎に 3 種類存在しているので、それぞれで動作を確認しておきました。結論としては全てのサービスで意図した通りの動作をします。特に説明しないので以下の画像を確認してください。

App Service (Azure Functions 含む)


Static Web Apps


Container Apps

全てのサービスで /.auth/logout にアクセスすると、IdP 側にリダイレクトされた後に元のサービスに戻ってくるという挙動になっています。RP-Initiated Logout では id_token_hint を受け付けることも出来ますが、現時点の実装では特に付けられていません。

Azure AD B2C の設定にはログアウト時に id_token_hint を必須にするという設定があるので、それを有効にすると正常にログアウト出来なくなるので注意が必要です。

確認した限りでは既に全てのリージョンで利用できるようになっているみたいなので、今後は OpenID Connect を利用した際のログアウトの挙動に悩まされることはなさそうです。