無限ログインループ発生
どういうアプリで起きたか
ASP.NET core MVC(2.2)のWEBアプリケーション(の社内ツール)です
(自分はその開発・保守をしています)。
利用者の認証にはAzure Active directory v2のOpen ID Connectを組み込んでいます。
社内ツールですが、社員の皆さんの手持ちのデバイスからもアクセスできるようになっています。
どういう環境で起きたのか
iOSを12.3にアップデート後、iPhoneユーザーの皆さんがSafariでアクセスするときにそれは起きました。
どういう事象が起きたか
ログイン画面でログインしても、またログイン画面に戻ってしまう「無限ログインループ」が発生していました。
直属の上司×2にその事象が起きて困っていた&若干イラついていたので、急いで調べました。
原因:Safariがトークンをくれなかった
まずそもそも認証の仕組みはどうなっているのか
サインインの処理が走ったタイミングで、
- クライアントからリダイレクトしてAzure ADにトークンを取得し
- そのトークンをアプリに再びリダイレクトし、
- アプリがしかるべきビューを返却しています
今年やっと公開された分かりやすい図です(この図がずっとほしかった、、、!)
(参照:https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-v2-aspnet-core-webapp)
事象が発生していた原因
ログイン画面から認証処理が走り、初期画面が表示されるのが正なのですが、
アプリに再度リダイレクトされるタイミングで、Azure ADから取得したトークンが削除されていました。
Safariのアップデート時に、同じサイトのものでないクッキーをリクエスト時に送信できない仕様に変更されたようです。
(参照:https://developer.apple.com/documentation/safari_release_notes/safari_12_release_notes)
クロスサイトスクリプティング対策のようです。
これに関連してか、cookieのsamesite属性がsafariでは未対応のようです。
対策:startup.csの設定を変えた
ASP.NET coreのstartup.csに設定することでSameSiteModeをオフにすることができます。
ひとまずこれによって無限ログインループは解消されました
services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
.AddAzureAD(options => {
Configuration.Bind("AzureAd", options);
})
.AddCookie(options=>
options.Cookie.SameSite = SameSiteMode.None
);
これから
safari13もプレビューになっているようですが、これからはcookieの設定もアプリでちゃんと管理しないといけないな、と思いました(小並感)。
参照
- webkitフォーラムでの議論
- https://bugs.webkit.org/show_bug.cgi?id=188165
- release 77でやってるから、てゆってるけど、、、
- djangoでのソリューション
- https://github.com/vintasoftware/safari-samesite-cookie-issue
- cookieの変化を説明してて分かりやすい
- asp.net 公式
- https://github.com/aspnet/AspNetCore/issues/4647
- プチ炎上
- MS的には「APPLEのせい!」
- stack overflowのissue
- CORSとは
- CookieのSamesite属性について