C#表单身份验证下Form Cookie与Session Cookie配置问题咨询
<authentication mode="Forms"> <forms loginUrl="~/Home/Register" timeout="10080" name="Test" slidingExpiration="true"/> </authentication> <sessionState cookieName="Test" timeout="5040"/>
- 不可行,绝对不允许两个Cookie使用相同的name值,会直接引发功能异常。
- 浏览器存储Cookie时以 域名+名称+路径 作为唯一标识,同域名下同名的表单验证Cookie和会话Cookie会被浏览器判定为同一个Cookie,导致相互覆盖。后续请求只会携带其中一个值,会出现要么身份验证票证校验失败、要么会话ID无效的问题。
- 两个模块的
timeout参数是分别读取对应配置节点的,本身不会互相干扰,但Cookie本身的冲突是必然发生的,建议立即修改为不同的名称,例如表单Cookie命名为Test_Auth,会话Cookie命名为Test_Session。
2. 配置slidingExpiration="true"后,超时时间是自动续期,还是需要后端调用特定函数才能实现续期?
- .NET Framework环境下的表单身份验证,开启
slidingExpiration="true"后,续期逻辑由框架自动完成,不需要手动调用额外接口。 - 具体触发规则:当请求到达服务端时,如果当前表单验证Cookie的剩余存活时间小于配置总超时时间的一半,框架会自动重发新的验证Cookie,将超时时间重置为你配置的10080分钟;如果剩余时间超过一半,不会触发续期。
- 常规的同步请求、Ajax异步请求默认都会触发续期,只有你需要主动禁止部分场景续期时,才需要手动处理。
- 该配置是行业通用的最佳实践,属于合理的配置方案。
- 两倍时长的设置逻辑主要是为了避免两个Cookie超时不同步的问题:避免用户还处于登录状态时,会话先过期导致的会话数据丢失、操作中断的体验问题,同时不会带来额外的安全风险。
- 两倍只是通用推荐值,不是强制标准,你可以根据自身业务的安全要求、用户体验需求灵活调整比例。
内容的提问来源于stack exchange,提问作者VSB
相关产品推荐
相关产品推荐

