如何在 ASP.NET 会话 Cookie 上设置安全标志?

如何在 ASP.NET 会话 Cookie 上设置安全标志,以便它只能通过 HTTPS 传输,而不能通过普通 HTTP 传输?

225314 次浏览

有两种方式,web.config中的一个 httpCookies元素允许您打开 requireSSL,它只传输包括 SSL 会话在内的所有 cookie,并且还有内部表单身份验证,但是如果您打开 httpcookies 的 SSL,您也必须打开内部表单配置。

为清晰起见进行编辑: 把这个放进 <system.web>

<httpCookies requireSSL="true" />

<system.web>元素中,添加以下元素:

<httpCookies requireSSL="true" />

但是,如果在 system.web\authentication块中有一个 <forms>元素,那么这将覆盖 httpCookies中的设置,将其设置回默认的 false

在这种情况下,还需要将 requireSSL="true"属性添加到 forms 元素中。

所以你最终会得到:

<system.web>
<authentication mode="Forms">
<forms requireSSL="true">
<!-- forms content -->
</forms>
</authentication>
</system.web>

有关这些元素的 MSDN 文档,请参见 给你给你

如果您谈论的是企业环境中的签入代码,那么事情很快就会变得一团糟。我们发现最好的方法是让 网络版 Release.config包含以下内容:

<system.web>
<compilation xdt:Transform="RemoveAttributes(debug)" />
<authentication>
<forms xdt:Transform="Replace" timeout="20" requireSSL="true" />
</authentication>
</system.web>

这样,开发人员就不会受到影响(在 Debug 中运行) ,只有获得发布版本的服务器才需要使用 SSL cookie。

Security-此属性告诉浏览器只有在请求通过诸如 HTTPS 之类的安全通道发送时才发送 cookie。这将有助于防止未加密请求传递 Cookie。如果应用程序可以通过 HTTP 和 HTTPS 访问,那么 Cookie 就有可能以明文形式发送。

基于@Mark D 的回答,我将使用 web.config 转换将所有不同的 cookie 设置为 Secure。这包括设置 anonymousIdentification cookieRequireSSLhttpCookies requireSSL

为了达到这个目的,你需要设置你的 web:

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<system.web>
<httpCookies xdt:Transform="SetAttributes(httpOnlyCookies)" httpOnlyCookies="true" />
<httpCookies xdt:Transform="SetAttributes(requireSSL)" requireSSL="true" />
<anonymousIdentification xdt:Transform="SetAttributes(cookieRequireSSL)" cookieRequireSSL="true" />
</system.web>
</configuration>

如果您正在使用 ASP.NET Membership Provider的角色和形式身份验证(我知道,这是古老的) ,那么您还需要将 roleManager cookieRequireSSLforms requireSSL属性设置为安全的。如果是这样,您的 web.release. config 可能看起来如下所示(包括上面的内容以及成员 API 的新标记) :

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<system.web>
<httpCookies xdt:Transform="SetAttributes(httpOnlyCookies)" httpOnlyCookies="true" />
<httpCookies xdt:Transform="SetAttributes(requireSSL)" requireSSL="true" />
<anonymousIdentification xdt:Transform="SetAttributes(cookieRequireSSL)" cookieRequireSSL="true" />
<roleManager xdt:Transform="SetAttributes(cookieRequireSSL)" cookieRequireSSL="true" />
<authentication>
<forms xdt:Transform="SetAttributes(requireSSL)" requireSSL="true" />
</authentication>
</system.web>
</configuration>

这里转换 web.config 的背景: http://go.microsoft.com/fwlink/?LinkId=125889

显然,这超出了 OP 最初的问题,但是如果你不把它们都设置成安全的,你可以期望安全扫描工具会注意到,你会看到红色标志出现在报告上。问我怎么知道的。:)