【问题标题】:Visual Studio 2015 and IIS Express Renews Session ID on Each RequestVisual Studio 2015 和 IIS Express 更新每个请求的会话 ID
【发布时间】:2016-12-29 23:06:24
【问题描述】:

我的 WebForms 项目有一个问题,即会话 ID 在每次请求时都会更新。这个问题在我的标准 IIS 上没有发生,所以我断定这是我的开发设置的本地问题。

为了测试,我只是用以下代码创建了一个 .aspx 页面:

<%: HttpContext.Current.Session.SessionID %>

如上所述,当我在本地刷新此页面并运行 Visual Studio 2015 和 IIS Express 时,每个请求都会获得一个新的会话 ID。 (调试、检查会话内容等等都会产生相同的结果。)

你觉得这是怎么回事?

(我看到有人声称浏览器链接功能可能会导致类似问题。我不明白这是怎么回事,但还是尝试禁用它,重新启动 Visual Studio 等,但无济于事。)

【问题讨论】:

    标签: asp.net session iis iis-express


    【解决方案1】:

    这次我将回答我自己的问题:

    当进一步检查会话 cookie 没有“粘住”的原因时,检查响应标头我突然意识到,出于某种原因,服务器试图将会话 cookie 设置为“安全”:

    Set-Cookie:ASP.NET_SessionId=lgkbje1igeprk3u53dsfbvtg; path=/; secure; HttpOnly
    

    虽然这本身并不是一件坏事,但在我的开发设置中这是出乎意料的。我没有通过 https 运行请求,因此会话 cookie 被删除了。

    在这种情况下,罪魁祸首是在 web.config 中找到的,我在那里:

    <httpCookies httpOnlyCookies="true" requireSSL="true" />
    

    这对我来说有点尴尬,但我认为这可能对将来的某人有所帮助,意识到观察到的行为(每个请求的新会话)可能来自尝试将会话 cookie 设置为“安全" 没有安全连接,即https

    [编辑] 回答 cmets 中关于不同环境的理想设置的问题:

    我认为您不能说本地、测试或临时环境存在“理想”设置,因为这完全取决于您对每个环境的需求。

    谈论生产环境的“理想”设置或如您所说的“实时”设置可能不那么随意;对于 ASP.NET,我个人总是使用:

    <httpCookies httpOnlyCookies="true" requireSSL="true" />
    

    为了扩展一般的安全主题,我还要确保设置了HSTS HTTP 标头。同样,实现这一点的确切方法取决于您的上下文,例如您使用的平台等。在较旧的 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 标头,以及您应该更改应用程序和 Web 服务器的默认配置以不显示的其他信息。以下是有关该主题的一些链接:

    此外,我会查看 machine.config 并设置:

    <deployment retail="true" />
    

    此设置应确保关闭调试模式并打开自定义错误,因此您不会意外泄漏堆栈跟踪等内容。这是关于该主题的博客 - 另一个不错的 Troy Hunt 作品,就像上面链接的一样 - 旧的,但仍然相关:

    OWASP Top 10 for .NET developers part 6: Security Misconfiguration - 特洛伊亨特

    【讨论】:

    • 一点也不尴尬。您能否为本地和“实时”添加理想的设置。
    • @LeeTaylor 其中一些可能有点离题,但我已根据您的要求更新了我的答案。希望对你有用:)
    【解决方案2】:

    解决了将此值添加到web.config

    <sessionState cookieless="UseCookies" cookieName="AppNameSession"></sessionState>
    

    【讨论】:

    • iis express 10 和 vs2017
    猜你喜欢
    • 2016-11-13
    • 2019-05-13
    • 2023-03-26
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 2021-06-15
    • 2016-04-13
    • 1970-01-01
    相关资源
    最近更新 更多