Asp.net mvc ASP.NET核心MVC:设置标识cookie的过期时间

Asp.net mvc ASP.NET核心MVC:设置标识cookie的过期时间,asp.net-mvc,asp.net-identity,asp.net-core,asp.net-core-mvc,Asp.net Mvc,Asp.net Identity,Asp.net Core,Asp.net Core Mvc,在我的ASP.NET Core MVC应用程序中,身份验证cookie的生存期设置为“会话”,因此它将持续到我关闭浏览器为止。 我使用MVC的默认身份验证方案: app.UseIdentity(); 如何延长cookie的生存期?试试看 app.UseIdentity().UseCookieAuthentication( new CookieAuthenticationOptions { ExpireTimeSpan = TimeSpan.FromHours(1

在我的ASP.NET Core MVC应用程序中,身份验证cookie的生存期设置为“会话”,因此它将持续到我关闭浏览器为止。 我使用MVC的默认身份验证方案:

app.UseIdentity();
如何延长cookie的生存期?

试试看

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

您正在使用的ASP.NET身份验证中间件是对
UseCookieAuthentication
的一些调用的包装,其中包括管道上的Cookie身份验证中间件。这可以在Identity中间件的builder扩展的源代码中看到。在这种情况下,配置底层Cookie身份验证应如何工作所需的选项被封装在
IdentityOptions
上,并在设置依赖项注入时进行配置

事实上,查看我链接到的源代码,您可以看到在调用
app.UseIdentity()
时会运行以下代码:

编辑:只有在调用
HttpContext.Authentication.SignInAsync
时,才使用
ExpireTimeSpan
属性,我们将
IsPersistent
设置为
true
传递
身份验证属性的实例

尝试使用Cookie身份验证中间件,结果证明这是可行的:如果我们只是在没有此选项的情况下登录,我们会得到一个持续会话的Cookie,如果我们一起发送,我们会得到一个持续配置中间件时设置的Cookie

使用ASP.NET Identity,方法是使用值
true
传递
PasswordSignInAsync
的参数
isPersistent
。这最终是调用
HttpContext的
SignInAsync
,传入
AuthenticationProperties
,并将
IsPersistent
设置为true。最终的结果是:

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

其中,
RememberMe
是我们将
IsPersistent
设置为true或false时的配置。

由于某种原因,我在使用
符号同步([…],true)
时遇到问题。浏览器中从未显示cookie(并且正确地说登录失败):

因此,我尝试将UTC时区差异添加到
ExpireTimeSpan

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) );

});
ASP.NET Core 2.0的服务附加属性

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

版本2.0有一个答案,但它不适合我。我必须做:

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

默认值为14天。

在ASP.NET Core 2.0中,使用ExpireTimeSpan属性而不是Cookie.Expiration

services.ConfigureApplicationCookie(options =>
{   
    options.Cookie.Name = "CookieName";         
    options.ExpireTimeSpan = TimeSpan.FromHours(24);
    options.SlidingExpiration = true;               
});
发件人:

Cookie.Expiration:获取或设置Cookie的寿命。目前,此选项没有ops,将在ASP.NET Core 2.1+中过时。使用ExpireTimeSpan选项设置cookie过期


谢谢,使用此方法,我可以使用此方法更改cookie的名称,但即使我将ExpireTimeSpan设置为“会话”,身份验证cookie的生存期也会设置为“会话”。知道为什么吗?这是我的Startup.cs:我尝试禁用Facebook身份验证。我没有使用https。@fiskeboss我添加了一个关于我发现的关于这件事的编辑。我在Core RC1上,它似乎不起作用。PasswordSignInAsync可以工作,但不会在响应中发送身份验证cookie“IsPersistent”非常有用;)@user1620696 SignInAsync中的“异步”部分很重要吗?因为我使用的是SignInI,我尝试了其他选项,但似乎被忽略了。在.NET Core 3.1中没有app.UseIdentity()。有没有类似的现代说法?这已经不是事实了。下面是文档中有关v2.1
ExpireTimeSpan
的摘录:存储在cookie中的身份验证票证过期的时间跨度。ExpireTimeSpan将添加到当前时间以创建票证的过期时间。ExpiredTimeSpan值始终进入服务器验证的加密AuthTicket。它也可以进入Set Cookie头,但只有在设置了ispersist的情况下。要将IsPersistent设置为true,请配置传递给SignInAsync的AuthenticationProperties。ExpireTimeSpan的默认值为14天。来源:我还将
options.ExpireTimeSpan=TimeSpan.FromDays(2)-即使MS不断改变主意如何做,其中一个也将是正确的。@gbjbaanb
选项。ExpireTimeSpan
是存储(和保护)在cookie中的应用程序值,浏览器或攻击者无权访问该值;而
options.Cookie.Expiration
是一个时间跨度,它将与浏览器通信。两个时间戳通常都必须对齐,以避免意外过期。@timmi4sa:没那么简单。在较新版本的.Net Core上,
options.Cookie.Expiration
实际上会触发一个配置异常,警告不应使用该异常。ApplicationUser和IdentityRole来自何处?我想我是按照这里的说明操作的:。它大部分是从IdentityUsera继承的,但仍然不起作用,它设置cookie的expires属性,但将expires头设置为1/1/1970。
services.ConfigureApplicationCookie(options =>
{
    options.ExpireTimeSpan = TimeSpan.FromDays(30);
});
services.ConfigureApplicationCookie(options =>
{   
    options.Cookie.Name = "CookieName";         
    options.ExpireTimeSpan = TimeSpan.FromHours(24);
    options.SlidingExpiration = true;               
});