ASP.NET Core MVCアプリでは、認証Cookieの有効期間が「セッション」に設定されているため、ブラウザーを閉じるまで持続します。 MVCにはデフォルトの認証スキームを使用します。
app.UseIdentity();
Cookieの有効期間を延長するにはどうすればよいですか?
使用しているASP.NET Identityミドルウェアは、パイプライン上のCookie認証ミドルウェアを含むUseCookieAuthentication
への呼び出しをラップするものです。これは、Identityミドルウェアのビルダー拡張機能のソースコードで見ることができます ここではGitHub 。その場合、基礎となるCookie認証の動作方法を構成するために必要なオプションは、IdentityOptions
にカプセル化され、依存性注入のセットアップ時に構成されます。
実際、リンクしたソースコードを見ると、app.UseIdentity()
を呼び出したときに次のコードが実行されていることがわかります。
var options = app.ApplicationServices.GetRequiredService<IOptions<IdentityOptions>>().Value;
app.UseCookieAuthentication(options.Cookies.ExternalCookie);
app.UseCookieAuthentication(options.Cookies.TwoFactorRememberMeCookie);
app.UseCookieAuthentication(options.Cookies.TwoFactorUserIdCookie);
app.UseCookieAuthentication(options.Cookies.ApplicationCookie);
return app;
IdentityOptions
クラスをセットアップするために、AddIdentity<TUser, TRole>
メソッドにはオーバーロードされたバージョンが1つあり、1つのラムダでオプションを構成できます。したがって、オプションを設定するにはラムダを渡すだけです。その場合は、オプションクラスのCookies
プロパティにアクセスし、必要に応じてApplicationCookie
を設定するだけです。タイムスパンを変更するには、次のようなことをします
services.AddIdentity<ApplicationUser, IdentityRole>(options => {
options.Cookies.ApplicationCookie.ExpireTimeSpan = TimeSpan.FromHours(1);
});
EDIT:ExpireTimeSpan
プロパティは、HttpContext.Authentication.SignInAsync
を呼び出すときにAuthenticationProperties
のインスタンスを渡す場合にのみ使用されますIsPersistent
はtrue
に設定されます。
Cookie認証ミドルウェアで試してみると、これが機能することがわかります:このオプションなしでサインインすると、セッションに続くCookieが取得され、一緒に送信すると、設定時に設定したCookieが取得されますミドルウェア。
ASP.NET Identityで行う方法は、isPersistent
のパラメーターPasswordSignInAsync
に値true
を渡すことです。これは、SignInAsync
のHttpContext
への呼び出しであり、AuthenticationProperties
をtrueに設定してIsPersistent
を渡します。呼び出しは次のようになります:
var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
RememberMe
は、IsPersistent
をtrueまたはfalseに設定する場合の構成です。
バージョン2.0には答えがありますが、うまくいきませんでした。私がしなければなりませんでした:
services.ConfigureApplicationCookie(options =>
{
options.ExpireTimeSpan = TimeSpan.FromDays(30);
});
デフォルト値は14日です。
ASP.NET Core 2.0の場合
services.ConfigureApplicationCookie(options =>
{
options.Cookie.Name = "CookieName";
options.Cookie.Expiration = TimeSpan.FromDays(2);
});
ASP.NET Core 2.0では、Cookie.ExpirationではなくExpireTimeSpanプロパティを使用します。
services.ConfigureApplicationCookie(options =>
{
options.Cookie.Name = "CookieName";
options.ExpireTimeSpan = TimeSpan.FromHours(24);
options.SlidingExpiration = true;
});
docs から:
Cookie.Expiration:Cookieの有効期間を取得または設定します。現在、このオプションは何もしません。ASP.NETCore 2.1+では廃止されます。 ExpireTimeSpanオプションを使用して、Cookieの有効期限を設定します。
試して
app.UseIdentity().UseCookieAuthentication(
new CookieAuthenticationOptions
{
ExpireTimeSpan = TimeSpan.FromHours(1)
}
);
何らかの理由で、SignInAsync([..], true)
を使用するときに問題が発生しました。ブラウザにCookieが表示されることはありませんでした(そして正しくログインできませんでした)。
そこで、ExpireTimeSpan
のTimeSpanにUTCタイムゾーンの差を追加してみました
services.AddIdentity<ApplicationUser, IdentityRole>(o =>
{
// add TimeSpan with 5 minutes plus timezone difference from Utc time
o.Cookies.ApplicationCookie.ExpireTimeSpan = DateTime.Now.Subtract(DateTime.UtcNow).Add( TimeSpan.FromMinutes(5) );
});
出来上がり!それは機能し、Cookieはブラウザでのみ+ 5min有効期限付きで表示されます。
Github.comへのPingBack https://github.com/aspnet/Identity/issues/766#issuecomment-253237576