如何在 ASP.NET 会话 Cookie 上设置安全标志,使其仅通过 HTTPS 传输,而不会通过普通 HTTP 传输?
5 回答
在<system.web>
元素中,添加以下元素:
<httpCookies requireSSL="true" />
但是,如果您的块<forms>
中有一个元素system.web\authentication
,那么这将覆盖 中的设置httpCookies
,将其设置回默认值false
。
在这种情况下,您还需要将requireSSL="true"
属性添加到表单元素。
所以你最终会得到:
<system.web>
<authentication mode="Forms">
<forms requireSSL="true">
<!-- forms content -->
</forms>
</authentication>
</system.web>
有两种方法,一个httpCookies
元素web.config
允许您打开requireSSL
它只传输所有 cookie,包括仅在 SSL 中的会话以及在表单身份验证中,但是如果您在 httpcookies 上打开 SSL,您还必须在表单配置中打开它。
为清楚起见进行编辑:
将其放入<system.web>
<httpCookies requireSSL="true" />
如果您谈论的是企业环境中的签入代码,事情很快就会变得混乱。我们发现最好的方法是让web.Release.config包含以下内容:
<system.web>
<compilation xdt:Transform="RemoveAttributes(debug)" />
<authentication>
<forms xdt:Transform="Replace" timeout="20" requireSSL="true" />
</authentication>
</system.web>
这样,开发人员不会受到影响(在 Debug 中运行),并且只有获得 Release 版本的服务器才要求 cookie 是 SSL。
基于@Mark D 的回答,我将使用 web.config 转换将所有各种 cookie 设置为 Secure。这包括设置anonymousIdentification cookieRequireSSL
和 httpCookies requireSSL
。
为此,您将 web.Release.config 设置为:
<?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 cookieRequireSSL
和forms 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 的原始问题,但如果您没有将它们全部设置为安全,您可以期望安全扫描工具会注意到并且您会看到报告上出现危险信号。问我怎么知道的。:)
安全 - 此属性告诉浏览器仅在请求通过 HTTPS 等安全通道发送时才发送 cookie。这将有助于保护 cookie 不被未加密的请求传递。如果可以通过 HTTP 和 HTTPS 访问应用程序,那么 cookie 就有可能以明文形式发送。