Visual Studio 2015 和 IIS Express 在每次请求时更新会话 ID
Visual Studio 2015 and IIS Express Renews Session ID on Each Request
我的 WebForms 项目有问题,每次请求都会更新会话 ID。我的标准 IIS 上没有出现此问题,因此我断定这是我的开发设置的本地问题。
为了测试,我使用以下代码简单地创建了一个 .aspx 页面:
<%: HttpContext.Current.Session.SessionID %>
如前所述,当我在本地刷新此页面时,运行 Visual Studio 2015 和 IIS Express,每个请求都会获得一个新的会话 ID。 (调试、检查会话内容等等都产生相同的结果。)
你觉得这是怎么回事?
(我看到声称浏览器 link 功能可能会导致类似的问题。我不明白那是怎么回事,但仍然尝试禁用它,重新启动 Visual Studio 等等,但无济于事。)
这次我将回答我自己的问题:
当进一步检查为什么 session cookie 没有 "stick" 时,检查响应 headers 我突然意识到由于某种原因服务器试图设置 session cookie 为 "secure":
Set-Cookie:ASP.NET_SessionId=lgkbje1igeprk3u53dsfbvtg; path=/; secure; HttpOnly
虽然这本身并不是一件坏事,但在我的开发设置中这是出乎意料的。我没有通过 https 运行 请求,因此 session cookie 被删除了。
在这种情况下,罪魁祸首是在 web.config
中找到的,我有:
<httpCookies httpOnlyCookies="true" requireSSL="true" />
这让我有点尴尬,但我认为这可能对将来的某些人有所帮助,意识到观察到的行为(每个请求都有新的 session)可能来自尝试设置session cookie 作为 "secure" 没有安全连接,即 https
.
[编辑] 回应评论中关于不同环境的理想设置的问题:
我认为您不能说 "ideal" 用于本地、测试或暂存环境的设置,因为这完全取决于您对每个环境的需求。
谈论生产环境的 "ideal" 设置或如您所说的 "live" 可能不那么随意;对于 ASP.NET,我个人总是使用:
<httpCookies httpOnlyCookies="true" requireSSL="true" />
为了扩展一般安全主题,我还要确保设置了 HSTS HTTP header。同样,实现此目的的确切方法取决于您的上下文,例如您使用的平台等。在较旧的 ASP.NET 应用程序中,AFAIK 没有更好的方法,我会在 Global.asax
中添加一些内容行:
protected void Application_BeginRequest(Object sender, EventArgs e) {
if(Request.IsLocal)
return;
switch (Request.Url.Scheme) {
case "https":
Response.AddHeader("Strict-Transport-Security", "max-age=300");
break;
case "http":
var path = "https://" + Request.Url.Host + Request.Url.PathAndQuery;
Response.Status = "301 Moved Permanently";
Response.AddHeader("Location", path);
break;
}
}
当然,还有其他与安全相关的 HTTP header,以及您应该更改应用程序和 Web 服务器的默认配置以不泄露的其他信息。以下是有关该主题的一些链接:
此外,我会查看 machine.config
并设置:
<deployment retail="true" />
此设置应该确保关闭调试模式并打开自定义错误,这样您就不会意外泄漏堆栈跟踪之类的东西。这是关于该主题的博客 - 另一个不错的 Troy Hunt 作品,就像上面链接的那个 - 旧的,但仍然相关:
OWASP Top 10 for .NET developers part 6: Security Misconfiguration - 特洛伊亨特
解决了将此值添加到 web.config
<sessionState cookieless="UseCookies" cookieName="AppNameSession"></sessionState>
我的 WebForms 项目有问题,每次请求都会更新会话 ID。我的标准 IIS 上没有出现此问题,因此我断定这是我的开发设置的本地问题。
为了测试,我使用以下代码简单地创建了一个 .aspx 页面:
<%: HttpContext.Current.Session.SessionID %>
如前所述,当我在本地刷新此页面时,运行 Visual Studio 2015 和 IIS Express,每个请求都会获得一个新的会话 ID。 (调试、检查会话内容等等都产生相同的结果。)
你觉得这是怎么回事?
(我看到声称浏览器 link 功能可能会导致类似的问题。我不明白那是怎么回事,但仍然尝试禁用它,重新启动 Visual Studio 等等,但无济于事。)
这次我将回答我自己的问题:
当进一步检查为什么 session cookie 没有 "stick" 时,检查响应 headers 我突然意识到由于某种原因服务器试图设置 session cookie 为 "secure":
Set-Cookie:ASP.NET_SessionId=lgkbje1igeprk3u53dsfbvtg; path=/; secure; HttpOnly
虽然这本身并不是一件坏事,但在我的开发设置中这是出乎意料的。我没有通过 https 运行 请求,因此 session cookie 被删除了。
在这种情况下,罪魁祸首是在 web.config
中找到的,我有:
<httpCookies httpOnlyCookies="true" requireSSL="true" />
这让我有点尴尬,但我认为这可能对将来的某些人有所帮助,意识到观察到的行为(每个请求都有新的 session)可能来自尝试设置session cookie 作为 "secure" 没有安全连接,即 https
.
[编辑] 回应评论中关于不同环境的理想设置的问题:
我认为您不能说 "ideal" 用于本地、测试或暂存环境的设置,因为这完全取决于您对每个环境的需求。
谈论生产环境的 "ideal" 设置或如您所说的 "live" 可能不那么随意;对于 ASP.NET,我个人总是使用:
<httpCookies httpOnlyCookies="true" requireSSL="true" />
为了扩展一般安全主题,我还要确保设置了 HSTS HTTP header。同样,实现此目的的确切方法取决于您的上下文,例如您使用的平台等。在较旧的 ASP.NET 应用程序中,AFAIK 没有更好的方法,我会在 Global.asax
中添加一些内容行:
protected void Application_BeginRequest(Object sender, EventArgs e) {
if(Request.IsLocal)
return;
switch (Request.Url.Scheme) {
case "https":
Response.AddHeader("Strict-Transport-Security", "max-age=300");
break;
case "http":
var path = "https://" + Request.Url.Host + Request.Url.PathAndQuery;
Response.Status = "301 Moved Permanently";
Response.AddHeader("Location", path);
break;
}
}
当然,还有其他与安全相关的 HTTP header,以及您应该更改应用程序和 Web 服务器的默认配置以不泄露的其他信息。以下是有关该主题的一些链接:
此外,我会查看 machine.config
并设置:
<deployment retail="true" />
此设置应该确保关闭调试模式并打开自定义错误,这样您就不会意外泄漏堆栈跟踪之类的东西。这是关于该主题的博客 - 另一个不错的 Troy Hunt 作品,就像上面链接的那个 - 旧的,但仍然相关:
OWASP Top 10 for .NET developers part 6: Security Misconfiguration - 特洛伊亨特
解决了将此值添加到 web.config
<sessionState cookieless="UseCookies" cookieName="AppNameSession"></sessionState>