しばやん雑記

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

Azure AD B2C を ASP.NET Core で使うと頻繁にログアウトするのを直す

Azure AD B2C を使ってログイン処理を実装した ASP.NET Core なアプリケーションが、何故か頻繁にログアウトしてしまうので調べてました。これもまた地味にはまったポイントです。

とりあえず OpenIdConnect な Middleware のコードを読んで調べました。

どうも Azure AD B2C 側で設定されている期限を優先している気配がありました。

最初は AddCookie で何も設定していないからかと思いましたが、ソースコードを調べた結果デフォルトは 14 日になっていたので、設定自体は問題ないことが分かりました。

前に Azure AD 自体のセッションが 1 時間で切れると聞いたことがあったので、期間を伸ばすしかないのかなーと思ってましたが、ぶちぞう RD が解決策を提示してくれました。流石 Azure 界の抱かれたい男 No.1。

設定を確認すると、確かに UseTokenLifetime = true となっていました。

元々 Azure AD B2C のログイン処理は GitHub のサンプルコードを参考に実装したので、サンプルコードの方を確認すると UseTokenLifetime = true となっていました。

https://github.com/Azure-Samples/active-directory-b2c-dotnetcore-webapp/blob/core2.0/WebApp-OpenIDConnect-DotNet/OpenIdConnectOptionsSetup.cs#L47

ドキュメントコメント曰く、UseTokenLifetime はデフォルトでは false らしいです。サンプルコードはアクセストークンを使う部分があるので、true にしていたみたいです。

設定を変えて、再度ログインすると 14 日有効なクッキーが発行されました。

f:id:shiba-yan:20171129010837p:plain

単にログイン用として使う場合は false にしておく方が良いですが、アクセストークンをログイン中の任意のタイミングで使う場合には true にすると自動的にログアウトされるので便利でしょう。

そういえば LINE Login が OpenID Connect に対応した時にも true にしていました。

LINE Login のアクセストークンは 30 日間有効なので、AD B2C のように問題にはならないはずです。

Web サービスのログインが 1 時間で毎回切れるとか、さすがにこっちが切れそうになるのでサンプルコードにコメントぐらい書いておいてほしかったというのが本音です。気を付けましょう。