asp.net core 5 关于浏览器cookies失效时间的问题

hztltgg 2020-12-09 03:52:15
以前.net 4 ,用cookies保存登录信息,设置过期时间,不持久化。好像是除非关闭浏览器,否则一直可以保持的。

感觉现在core的,浏览器过个可能是默认20分钟,就失效了,cookies里看到的也是有效期session。 那要怎么设置才能 关闭浏览器才失效?
...全文
4065 31 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
正怒月神 2020-12-11
  • 打赏
  • 举报
回复
引用 26 楼 hztltgg 的回复:
试了,确实走iis会过期,走exe,访问5000端口,不会过期,看来和iis还是有关系
先给个结论,估计你的iis程序池回收了。 看了你的代码,使用的是认证ticket票据。 那么本质上来说,是和session没关系。
hztltgg 2020-12-11
  • 打赏
  • 举报
回复
试了,确实走iis会过期,走exe,访问5000端口,不会过期,看来和iis还是有关系
hztltgg 2020-12-11
  • 打赏
  • 举报
回复
这个加了的,之前本机直接运行exe,可能是没有丢失,我现在在服务器上试试,一个通过iis,一个直接exe,同时登录,看看是不是会不同

        services.AddAuthentication(
            Sub(options)
                options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme
            End Sub).AddCookie(Sub(options)
                                   options.ExpireTimeSpan = TimeSpan.FromHours(8)
                                   options.SlidingExpiration = False
                               End Sub)
正怒月神 2020-12-11
  • 打赏
  • 举报
回复
引用 30 楼 icoolno1 的回复:
[quote=引用 27 楼 正怒月神 的回复:][quote=引用 26 楼 hztltgg 的回复:]试了,确实走iis会过期,走exe,访问5000端口,不会过期,看来和iis还是有关系
先给个结论,估计你的iis程序池回收了。 看了你的代码,使用的是认证ticket票据。 那么本质上来说,是和session没关系。[/quote] 翻了一下源代码,好像跟Session是有关的,客户端的票据也是内置的实现,不重启不超时就一直存在,如果超时或重启就会刷新SessionID以及票据内容,感觉应该是哪里可以配置的,让其从客户端票据中恢复登录状态,但官方文档里没找更详细说明,要自己去翻源码了。[/quote] 分开讨论, 1 楼主说,网页和exe的过期有差异。 然后也设置过网页的session过期。 那么考虑到你们讨论的iis部署,我估计是应用程序池回收导致的。 2 FormsAuthenticationTicket 其实只存储了一个加密的string类型userData。 通过cookie的票据,来确定是否解密userData。 3 回过头来,我们再看,其实无论session还是FormsAuthenticationTicket . 代码里,是设置了过期时间的。 那么iis发布后,依然20分钟被回收。 我只能推断出是IIS里应用程序池的回收导致的。
八爻老骥 2020-12-11
  • 打赏
  • 举报
回复
引用 27 楼 正怒月神 的回复:
[quote=引用 26 楼 hztltgg 的回复:]试了,确实走iis会过期,走exe,访问5000端口,不会过期,看来和iis还是有关系

先给个结论,估计你的iis程序池回收了
看了你的代码,使用的是认证ticket票据。
那么本质上来说,是和session没关系。[/quote]

翻了一下源代码,好像跟Session是有关的,客户端的票据也是内置的实现,不重启不超时就一直存在,如果超时或重启就会刷新SessionID以及票据内容,感觉应该是哪里可以配置的,让其从客户端票据中恢复登录状态,但官方文档里没找更详细说明,要自己去翻源码了。
hztltgg 2020-12-11
  • 打赏
  • 举报
回复
问题应该解决了,以前net4解cookie的key在Machine.config,现在asp.net core不依赖web.config, cookes的密钥是要自己维护了。 不加AddDataProtection,iis重启一下站点,网站就要重新登录,目前加上AddDataProtection,网站重启也不会丢失登录了。
hztltgg 2020-12-11
  • 打赏
  • 举报
回复
按这个思路,找到一篇blog https://blog.csdn.net/weixin_33751566/article/details/93722156 说在默认情况下程序每次启动时会生成一个密钥 key, 当你把程序停止时 这个key就会失去,再启动时生成一个新的key,所以之前的登陆信息就会失效。 services.AddDataProtection() .PersistKeysToFileSystem(new DirectoryInfo(@"d:\temp-keys\")); 把密钥保存起来,再观察看看。
hztltgg 2020-12-10
  • 打赏
  • 举报
回复
引用 6 楼 icoolno1 的回复:
[quote=引用 5 楼 hztltgg 的回复:][quote=引用 3 楼 icoolno1 的回复:]试试这个。

public void ConfigureServices(IServiceCollection services)
        {
            services.AddSession(options => { options.IdleTimeout = TimeSpan.MaxValue; });
            //...
        }
这个是吧session时间延长吧,不太想让服务器session保存太久。 我的意思是以前用FormsAuthentication认证,cookies里面是不是已经有认证信息了,并不需要服务器保存 用户状态,那个.aspxauth里面保留了全部信息,带上就行。 现在core里用AddAuthentication,使用CookieAuthenticationDefaults.AuthenticationScheme ,生成的 .aspnetcore.cookies 是不保存信息,还需要服务器session配合来判断?服务器session超时,哪怕客户端带上cookies也没用?[/quote] 那试试改下SignInAsync的参数:

await HttpContext.SignInAsync(
    CookieAuthenticationDefaults.AuthenticationScheme,
    new ClaimsPrincipal(claimsIdentity),
    new AuthenticationProperties
    {
        ExpiresUtc = DateTime.UtcNow.AddMinutes(20)//这地方Cookie的过期时间。
    });
[/quote] 这个我后来加了,IsPersistent也设置为true,这样哪怕浏览器关了,再次打开都能是登录状态,查看浏览器cookies过期时间也是从session变成具体时间了,但还是没到设置的时间就会丢失。
andy_wanhl 2020-12-10
  • 打赏
  • 举报
回复
学 习一下。
正怒月神 2020-12-10
  • 打赏
  • 举报
回复
引用 4 楼 hztltgg 的回复:
[quote=引用 2 楼 正怒月神 的回复:]一样吧, 也是设置session过期时间,我记得是在web.config中配置。 反正不管是不是core,应该都差不多。 至于是不是使用数据库存储,还是进程存储session。这个需要你回去看web.config中的另一个设置。
asp.net core 应该不用web.config 配置了吧,现在的介绍都是在代码里写的[/quote] 大意是差不多的。 只是把配置放到了方法里。
八爻老骥 2020-12-10
  • 打赏
  • 举报
回复
引用 5 楼 hztltgg 的回复:
[quote=引用 3 楼 icoolno1 的回复:]试试这个。

public void ConfigureServices(IServiceCollection services)
{
services.AddSession(options => { options.IdleTimeout = TimeSpan.MaxValue; });
//...
}

这个是吧session时间延长吧,不太想让服务器session保存太久。
我的意思是以前用FormsAuthentication认证,cookies里面是不是已经有认证信息了,并不需要服务器保存 用户状态,那个.aspxauth里面保留了全部信息,带上就行。
现在core里用AddAuthentication,使用CookieAuthenticationDefaults.AuthenticationScheme ,生成的 .aspnetcore.cookies 是不保存信息,还需要服务器session配合来判断?服务器session超时,哪怕客户端带上cookies也没用?[/quote]

那试试改下SignInAsync的参数:

await HttpContext.SignInAsync(
CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(claimsIdentity),
new AuthenticationProperties
{
ExpiresUtc = DateTime.UtcNow.AddMinutes(20)//这地方Cookie的过期时间。
});
hztltgg 2020-12-10
  • 打赏
  • 举报
回复
引用 3 楼 icoolno1 的回复:
试试这个。

public void ConfigureServices(IServiceCollection services)
        {
            services.AddSession(options => { options.IdleTimeout = TimeSpan.MaxValue; });
            //...
        }
这个是吧session时间延长吧,不太想让服务器session保存太久。 我的意思是以前用FormsAuthentication认证,cookies里面是不是已经有认证信息了,并不需要服务器保存 用户状态,那个.aspxauth里面保留了全部信息,带上就行。 现在core里用AddAuthentication,使用CookieAuthenticationDefaults.AuthenticationScheme ,生成的 .aspnetcore.cookies 是不保存信息,还需要服务器session配合来判断?服务器session超时,哪怕客户端带上cookies也没用?
hztltgg 2020-12-10
  • 打赏
  • 举报
回复
引用 2 楼 正怒月神 的回复:
一样吧, 也是设置session过期时间,我记得是在web.config中配置。 反正不管是不是core,应该都差不多。 至于是不是使用数据库存储,还是进程存储session。这个需要你回去看web.config中的另一个设置。
asp.net core 应该不用web.config 配置了吧,现在的介绍都是在代码里写的
八爻老骥 2020-12-10
  • 打赏
  • 举报
回复
引用 23 楼 hztltgg 的回复:
[quote=引用 20 楼 icoolno1 的回复:][quote=引用 17 楼 hztltgg的回复:][quote=引用 15 楼 icoolno1 的回复:][quote=引用 13 楼 hztltgg 的回复:]SignOut 除了点击退出链接才会访问,系统应该不会自动调用。

目前就是登录正常,登录后生成 .AspNetCore.Session .AspNetCore.Cookies 过期时间是session,如果设置过期时间就是具体时间。但浏览器不关闭,等可能是20分钟,在刷新页面就跳转登录页了。


你部署在什么地方的?IIS?还是直接exe运行?你试试直接用exe运行会不会过期。[/quote]

确实是在iis上,你这样一说,我在vs里调试的时候,是没有出现过丢失的情况。难道是iis自动回收了?[/quote]
只有这个可能了,iis回收相当于服务端重启了,产生了新的会话id(不是session),之前的就不认了。[/quote]

如果是这样的话,那就不好处理了,之前net4应该是没这个问题,回收重启还是能解认证信息,这 core在iis是独立程序了,不知道用什么方法了,难道只能用jwt,浏览器自己每次带token?

我现在看了一下,就是登录后有两个cookie,一个是 .AspNetCore.Cookies,一个是.AspNetCore.Session 。过一段时间访问,提示401,转向登录,带回来一个 Set-Cookie: .AspNetCore.Session 头,内容变了,让浏览器重新设置会话了。[/quote]

再试试这个看看。

修改CookieAuthenticationOptions.ExpireTimeSpan

services.AddAuthentication(o => { }).AddCookie(o=> {
o.ExpireTimeSpan = TimeSpan.MaxValue;
});
hztltgg 2020-12-10
  • 打赏
  • 举报
回复
引用 20 楼 icoolno1 的回复:
[quote=引用 17 楼 hztltgg的回复:][quote=引用 15 楼 icoolno1 的回复:][quote=引用 13 楼 hztltgg 的回复:]SignOut 除了点击退出链接才会访问,系统应该不会自动调用。 目前就是登录正常,登录后生成 .AspNetCore.Session .AspNetCore.Cookies 过期时间是session,如果设置过期时间就是具体时间。但浏览器不关闭,等可能是20分钟,在刷新页面就跳转登录页了。
你部署在什么地方的?IIS?还是直接exe运行?你试试直接用exe运行会不会过期。[/quote] 确实是在iis上,你这样一说,我在vs里调试的时候,是没有出现过丢失的情况。难道是iis自动回收了?[/quote] 只有这个可能了,iis回收相当于服务端重启了,产生了新的会话id(不是session),之前的就不认了。[/quote] 如果是这样的话,那就不好处理了,之前net4应该是没这个问题,回收重启还是能解认证信息,这 core在iis是独立程序了,不知道用什么方法了,难道只能用jwt,浏览器自己每次带token? 我现在看了一下,就是登录后有两个cookie,一个是 .AspNetCore.Cookies,一个是.AspNetCore.Session 。过一段时间访问,提示401,转向登录,带回来一个 Set-Cookie: .AspNetCore.Session 头,内容变了,让浏览器重新设置会话了。
hztltgg 2020-12-10
  • 打赏
  • 举报
回复
这个真没有,以前就是普通的认证,设置不持久化,8小时过期,浏览器开一天都不会需要重新登录,认证信息应该是不依赖session的,代码我是vb的,不好意思在c#里贴,我现在贴一下,vb c#是一家,版主不要骂我

                    '创建一个FormsAuthenticationTicket,它包含登录名以及额外的用户数据。 
                    Dim ticket = New FormsAuthenticationTicket(du.Id.ToString, False, 60 * 8)

                    '加密Ticket,变成一个加密的字符串。 
                    Dim cookieValue = FormsAuthentication.Encrypt(ticket)

                    '根据加密结果创建登录Cookie
                    Dim cookie = New HttpCookie(FormsAuthentication.FormsCookieName, cookieValue)

                    Response.Cookies.Remove(cookie.Name)
                    Response.Cookies.Add(cookie)

                    Return Redirect(If(String.IsNullOrEmpty(lvm.ReturnUrl), "/Console", lvm.ReturnUrl))
正怒月神 2020-12-10
  • 打赏
  • 举报
回复
引用 18 楼 hztltgg 的回复:
[quote=引用 16 楼 正怒月神 的回复:][quote=引用 10 楼 hztltgg 的回复:][quote=引用 7 楼 正怒月神 的回复:][quote=引用 4 楼 hztltgg 的回复:][quote=引用 2 楼 正怒月神 的回复:]一样吧, 也是设置session过期时间,我记得是在web.config中配置。 反正不管是不是core,应该都差不多。 至于是不是使用数据库存储,还是进程存储session。这个需要你回去看web.config中的另一个设置。
asp.net core 应该不用web.config 配置了吧,现在的介绍都是在代码里写的[/quote] 大意是差不多的。 只是把配置放到了方法里。 [/quote] 你的意思是和服务器的session过期时间还是有关?但默认session过期是20分钟,以前FormsAuthentication没遇到这种情况,都是浏览器关闭才过期的,难道core实现不一样?[/quote] 是的,我感觉和session有关。 但是我前面也提到,主要看session保存的机制,以前是可以保存在另一个进程或者数据库的。 .net core的这方面设置我不清楚,你可以查一查。 不过我觉得,你还是需要看以前所谓的“可以一直保留,直到关闭浏览器”,是如何实现的, 因为这个东西,肯定不是默认的。 甚至,我觉得都不一定用到了session机制。[/quote] 我印象中,cookies认证是自己加密自己解密,不依赖session的,以前就是在cookies里放一个FormsAuthentication,设置一下过期时间8小时,不持久化 [/quote] cookies和session的主要关系是保存一个sessionid, 然后每次访问,服务器到cookie找到这个sessionid, 接着去session里拿出对应的当前session。 至于cookie保存的其他数据,服务器不管,自己实现。 那么就很明显,哪怕你cookie设置的在场,只要session自己过期, 拿到cookie中的sessionid,但也找不到服务器端的session了。 因此,我说你们系统的session不过期,只有关闭浏览器才会过期的方法,应该是有其他的设置导致的。 因为你也知道session默认20分钟过期。
八爻老骥 2020-12-10
  • 打赏
  • 举报
回复
引用 17 楼 hztltgg的回复:
[quote=引用 15 楼 icoolno1 的回复:][quote=引用 13 楼 hztltgg 的回复:]SignOut 除了点击退出链接才会访问,系统应该不会自动调用。 目前就是登录正常,登录后生成 .AspNetCore.Session .AspNetCore.Cookies 过期时间是session,如果设置过期时间就是具体时间。但浏览器不关闭,等可能是20分钟,在刷新页面就跳转登录页了。
你部署在什么地方的?IIS?还是直接exe运行?你试试直接用exe运行会不会过期。[/quote] 确实是在iis上,你这样一说,我在vs里调试的时候,是没有出现过丢失的情况。难道是iis自动回收了?[/quote] 只有这个可能了,iis回收相当于服务端重启了,产生了新的会话id(不是session),之前的就不认了。
八爻老骥 2020-12-10
  • 打赏
  • 举报
回复
引用 18 楼 hztltgg的回复:
[quote=引用 16 楼 正怒月神 的回复:][quote=引用 10 楼 hztltgg 的回复:][quote=引用 7 楼 正怒月神 的回复:][quote=引用 4 楼 hztltgg 的回复:][quote=引用 2 楼 正怒月神 的回复:]一样吧, 也是设置session过期时间,我记得是在web.config中配置。 反正不管是不是core,应该都差不多。 至于是不是使用数据库存储,还是进程存储session。这个需要你回去看web.config中的另一个设置。
asp.net core 应该不用web.config 配置了吧,现在的介绍都是在代码里写的[/quote] 大意是差不多的。 只是把配置放到了方法里。 [/quote] 你的意思是和服务器的session过期时间还是有关?但默认session过期是20分钟,以前FormsAuthentication没遇到这种情况,都是浏览器关闭才过期的,难道core实现不一样?[/quote] 是的,我感觉和session有关。 但是我前面也提到,主要看session保存的机制,以前是可以保存在另一个进程或者数据库的。 .net core的这方面设置我不清楚,你可以查一查。 不过我觉得,你还是需要看以前所谓的“可以一直保留,直到关闭浏览器”,是如何实现的, 因为这个东西,肯定不是默认的。 甚至,我觉得都不一定用到了session机制。[/quote] 我印象中,cookies认证是自己加密自己解密,不依赖session的,以前就是在cookies里放一个FormsAuthentication,设置一下过期时间8小时,不持久化 [/quote] cookie验证确实跟session无关,只不过服务端的principal和session放在一个地方,session有过期设置,principal没有,既使有也会根据上下文自行恢复的,所以无关。
hztltgg 2020-12-10
  • 打赏
  • 举报
回复
引用 16 楼 正怒月神 的回复:
[quote=引用 10 楼 hztltgg 的回复:][quote=引用 7 楼 正怒月神 的回复:][quote=引用 4 楼 hztltgg 的回复:][quote=引用 2 楼 正怒月神 的回复:]一样吧, 也是设置session过期时间,我记得是在web.config中配置。 反正不管是不是core,应该都差不多。 至于是不是使用数据库存储,还是进程存储session。这个需要你回去看web.config中的另一个设置。
asp.net core 应该不用web.config 配置了吧,现在的介绍都是在代码里写的[/quote] 大意是差不多的。 只是把配置放到了方法里。 [/quote] 你的意思是和服务器的session过期时间还是有关?但默认session过期是20分钟,以前FormsAuthentication没遇到这种情况,都是浏览器关闭才过期的,难道core实现不一样?[/quote] 是的,我感觉和session有关。 但是我前面也提到,主要看session保存的机制,以前是可以保存在另一个进程或者数据库的。 .net core的这方面设置我不清楚,你可以查一查。 不过我觉得,你还是需要看以前所谓的“可以一直保留,直到关闭浏览器”,是如何实现的, 因为这个东西,肯定不是默认的。 甚至,我觉得都不一定用到了session机制。[/quote] 我印象中,cookies认证是自己加密自己解密,不依赖session的,以前就是在cookies里放一个FormsAuthentication,设置一下过期时间8小时,不持久化
加载更多回复(11)

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧