.Net MVC 应用程序中的安全标志未设置为 Cookie

信息安全 tls Web应用程序 饼干
2021-08-30 13:59:05

我在我的Web.ConfigGlbal.asax.cs文件中包含了以下代码行,但是当我在浏览器中使用开发人员工具时,我没有为以下 cookie 设置安全标志。还在我的 IIS 中配置了 SSLSettings(选中的复选框 requireSSL)。

我想为所有 cookie 设置安全属性,不仅是接收到的,而且是发送的 cookie。

Web.config

<httpCookies requireSSL="true"/>

Global.asax.cs

protected void Application_EndRequest(object sender, EventArgs e)
        {
            if (Request.IsSecureConnection == true && HttpContext.Current.Request.Url.Scheme == "https")
            {
                Request.Cookies["ASP.NET_SessionID"].Secure = true;
                if (Request.Cookies.Count > 0)
                {
                    foreach (string s in Request.Cookies.AllKeys)
                    {
                        Request.Cookies[s].Secure = true;
                    }
                }

                Response.Cookies["ASP.NET_SessionID"].Secure = true;
                if (Response.Cookies.Count > 0)
                {
                    foreach (string s in Response.Cookies.AllKeys)
                    {
                        Response.Cookies[s].Secure = true;
                    }
                }
            }
        }

然后我在本地机器上的 IIS 7.5 上托管了我的应用程序。并在 SSL 设置中启用了 RequireSSL 选项。当我单击浏览 *.443(https) 时,我可以看到 localhost 使用 HTTPS 运行,但是当我在浏览器中检查 cookie 属性时,未设置安全标志。

我在这里缺少任何配置吗?

开发人员工具的屏幕截图,其中收到的 cookie 被标记为安全但发送的 cookie 不是。

1个回答

您的困惑不是编码或配置错误的结果,而是对 cookie 如何工作的误解。

当服务器想要创建或更改 cookie 时,它​​会使用Set-Cookie响应标头来执行此操作。在那里,服务器还可以指定浏览器应如何处理 cookie,例如保存多长时间、是否安全等。此信息仅在 cookie 首次创建时发送一次。

在每次请求时,客户端都会在Cookies请求标头中将所有 cookie 发送到服务器然后它只发送名称和值。不发送附加信息(例如安全标志)。这些是从服务器到客户端的指令,客户端无需将指令重复回服务器。

因此,如果服务器secureSet-Cookie标头中包含标志,则cookie 是“安全的” 然后客户端在Cookies标头中发送的内容无关紧要。因此,像您一样尝试将请求 cookie 标记为安全是没有意义的。

那么为什么在您的开发人员工具中未将发送的 cookie 报告为安全的呢?这只是因为该字段不适用于他们,因此留空。我不知道如何在 IE 中执行此操作,但如果您切换到 Chrome,您可以在“应用程序”选项卡下获得所有 cookie 的列表,您可以轻松查看哪些被标记为安全。

免责声明:我不是 ASP.NET 程序员。