ASP.NET Core2.1にはGDPR対応の仕組みがある。
これは、リクエストに指定されたCookieが埋め込まれていなかった場合には(defaultではkey:.AspNet.Consent, value:yes)Cookieをレスポンスしない、というものになる。
GDPR対応を有効にした上で設定を上記に示したURLのサンプルや、現在のASP.NET Core2.1の初期テンプレートのままにした場合、Sessionが利用できない。
デフォルトのSessionはCookieにSessionIDを埋め込むことで、そのKeyをもとにStateを維持する仕組みなので、Cookieがレスポンスされない状態では毎回SessionIDが変わってしまうためである。
ではAuthrnticationでCookie認証を使用する場合のCookieはGDPRではどうなるだろうか?
AuthenticationのCookieは認証を行なった場合にはGDPR関係なくレスポンスされる。
逆にCookieBuilderoptionsなどでcookieのIsEssentialプロパティをfalseに変更してもクッキーはレスポンスされた。
この3つが同時に働くと奇妙な状況が発生したりする。
認証はしているがGDPRのOKCookieが埋め込まれていない場合、認証してUser.Identityなどが取得できるのにセッションが利用できない、みたいな状況になる。
この変な状態を起こさないようにするためには、
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies
// is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
CookiePolicyOptionsでのCheckConsentNeededの設定を修正してあげればよい。
CheckConsentNeededは、そのリクエストがユーザが同意しているかチェックし、クッキー制御を行う必要があるかを判定するFuncを設定する。
例えば、サインインしている場合にはGDPRの個人情報追跡に同意したとみなして、クッキーチェックの必要がないという風に設定してあげれば、認証していれば必ずセッションが正常に使えるという状況を作れる。
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => context?.User?.Identity?.IsAuthenticated != true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});