Azure AD B2C を使ってログイン処理を実装した ASP.NET Core なアプリケーションが、何故か頻繁にログアウトしてしまうので調べてました。これもまた地味にはまったポイントです。
とりあえず OpenIdConnect な Middleware のコードを読んで調べました。
AAD B2C を https://t.co/9vTmtCukjr Core から使ったら 1 時間でセッションが切れる件は B2C 側の id token 有効期限を優先してるからっぽいか
— しばやん (@shibayan) 2017年11月28日
どうも Azure AD B2C 側で設定されている期限を優先している気配がありました。
最初は AddCookie で何も設定していないからかと思いましたが、ソースコードを調べた結果デフォルトは 14 日になっていたので、設定自体は問題ないことが分かりました。
Cookie Auth は 14 日設定になってるのに、B2C だと 1 時間になるの罠くさいな
— しばやん (@shibayan) 2017年11月28日
前に Azure AD 自体のセッションが 1 時間で切れると聞いたことがあったので、期間を伸ばすしかないのかなーと思ってましたが、ぶちぞう RD が解決策を提示してくれました。流石 Azure 界の抱かれたい男 No.1。
UseTokenLifetimeをオフればいくない?
— こすもす.えび (@kosmosebi) 2017年11月28日
設定を確認すると、確かに UseTokenLifetime = true となっていました。
元々 Azure AD B2C のログイン処理は GitHub のサンプルコードを参考に実装したので、サンプルコードの方を確認すると UseTokenLifetime = true となっていました。
ドキュメントコメント曰く、UseTokenLifetime はデフォルトでは false らしいです。サンプルコードはアクセストークンを使う部分があるので、true にしていたみたいです。
設定を変えて、再度ログインすると 14 日有効なクッキーが発行されました。
単にログイン用として使う場合は false にしておく方が良いですが、アクセストークンをログイン中の任意のタイミングで使う場合には true にすると自動的にログアウトされるので便利でしょう。
そういえば LINE Login が OpenID Connect に対応した時にも true にしていました。
LINE Login のアクセストークンは 30 日間有効なので、AD B2C のように問題にはならないはずです。
Web サービスのログインが 1 時間で毎回切れるとか、さすがにこっちが切れそうになるのでサンプルコードにコメントぐらい書いておいてほしかったというのが本音です。気を付けましょう。