web-dev-qa-db-ja.com

ASP.NET Core MVC:ID Cookieの有効期限を設定する

ASP.NET Core MVCアプリでは、認証Cookieの有効期間が「セッション」に設定されているため、ブラウザーを閉じるまで持続します。 MVCにはデフォルトの認証スキームを使用します。

app.UseIdentity();

Cookieの有効期間を延長するにはどうすればよいですか?

28
severin

使用している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のインスタンスを渡す場合にのみ使用されますIsPersistenttrueに設定されます。

Cookie認証ミドルウェアで試してみると、これが機能することがわかります:このオプションなしでサインインすると、セッションに続くCookieが取得され、一緒に送信すると、設定時に設定したCookieが取得されますミドルウェア。

ASP.NET Identityで行う方法は、isPersistentのパラメーターPasswordSignInAsyncに値trueを渡すことです。これは、SignInAsyncHttpContextへの呼び出しであり、AuthenticationPropertiesをtrueに設定してIsPersistentを渡します。呼び出しは次のようになります:

var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);

RememberMeは、IsPersistentをtrueまたはfalseに設定する場合の構成です。

42
user1620696

バージョン2.0には答えがありますが、うまくいきませんでした。私がしなければなりませんでした:

services.ConfigureApplicationCookie(options =>
{
    options.ExpireTimeSpan = TimeSpan.FromDays(30);
});

デフォルト値は14日です。

10
cheesemacfly

ASP.NET Core 2.0の場合

  services.ConfigureApplicationCookie(options =>
        {
            options.Cookie.Name = "CookieName";
            options.Cookie.Expiration = TimeSpan.FromDays(2);
        });
9
Ahmed Al Jabry

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の有効期限を設定します。

7
BorisSh

試して

app.UseIdentity().UseCookieAuthentication(
    new CookieAuthenticationOptions
    {
        ExpireTimeSpan = TimeSpan.FromHours(1)
    }
);
2
Damien Dennehy

何らかの理由で、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

1
Ole K