.NET 4.0站点修改web.config的requireSSL为true后Session值自动为空如何解决
故障解决方法
核心原因
你遇到的Session丢失问题是因为.NET Framework中SessionId Cookie的安全属性独立于全局httpCookies配置,仅修改httpCookies的requireSSL会导致两边配置不一致,浏览器拒绝存储匹配的SessionId Cookie,每次请求都会生成新的空Session。
具体操作步骤
- 第一步:修改sessionState配置节点,新增
requireSSL="true"属性
修改后完整的sessionState配置如下:
<sessionState mode="InProc" cookieless="false" timeout="20" requireSSL="true"></sessionState>
- 第二步:配置全站HTTP强制跳转HTTPS
Secure属性的Cookie仅会在HTTPS请求下发送给服务器,如果存在HTTP访问的情况会导致Cookie不被提交,Session无法匹配。可在web.config的system.webServer节点下添加如下重定向规则(需要IIS提前安装URL重写模块):
<rewrite> <rules> <rule name="HTTP转HTTPS强制跳转" stopProcessing="true"> <match url="(.*)" /> <conditions> <add input="{HTTPS}" pattern="off" ignoreCase="true" /> </conditions> <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" /> </rule> </rules> </rewrite>
- 第三步(可选):显式指定Cookie根路径匹配虚拟目录
如果站点部署在/Project虚拟目录下,可在httpCookies节点新增path属性避免跨目录Cookie不匹配问题,修改后配置如下:
<httpCookies requireSSL="true" httpOnlyCookies="true" domain="" path="/Project" />
验证方法
配置修改后重启站点,打开浏览器开发者工具的存储面板,查看ASP.NET_SessionIdCookie的Secure属性已开启,Path属性与站点根路径匹配,访问不同目录页面时Session值可正常读取即可。
内容的提问来源于stack exchange,提问作者user1463065
相关产品推荐
相关产品推荐

