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


Answers:


127

有两种方法,其中一个httpCookies元素web.config允许您requireSSL仅打开所有cookie,包括仅以SSL传输的cookie,也可以在表单身份验证中打开,但是,如果在httpcookies上打开SSL,则还必须在表单配置中也打开它。

编辑为清楚: 在将这个<system.web>

<httpCookies requireSSL="true" />

13
+1为了澄清,这是您应该添加到web.config中以将auth cookie上的安全标志设置为true的方法<httpCookies requireSSL="true" />
Tr1stan 2011年

8
请注意,这取决于您的(服务器级)配置。我使测试区域下降,并显示错误消息:“应用程序配置为发出安全cookie。这些cookie要求浏览器通过SSL(https协议)发出请求。但是,当前请求不是通过SSL。” 这是因为我们有一个反向代理,浏览器通过SSL连接到它,但是IIS服务器的反向代理是通过端口80,因此应用程序认为它是不安全的。
mlhDev 2014年

4
@Bargitta我们处理了Application_PreSendRequestHeaders事件,如果某个应用程序设置为true,则将所有 cookie 设置为安全。此应用程序设置仅为我们的HTTPS外部站点设置。
mlhDev

我知道了,所以您的所有外部站点都将使用HTTPS,谢谢。
Bargitta 2015年

我在其他地方看到过,在IIS7 system.web被system.webserver取代之后,我尝试将这一设置放在那里。在IIS 8.5上,这虽然引起了配置错误,但是如果我将sys.web部分添加到配置文件中并将设置放入其中,则所有操作都可以进行。
Eborbob

181

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

<httpCookies requireSSL="true" />

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

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

因此,您将得到:

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

有关这些元素的MSDN文档,请参见此处此处


2
您可以通过包含'lockItem'属性来避免其他Web.config设置覆盖您的<httpCookies requireSSL =“ true” />设置。像这样:<httpCookies requireSSL =“ true” lockItem =“ true” />。这里的更多信息dotnetnoob.com/2010/11/how-to-secure-aspnet-cookies.html
JTech,2016年

1
此外,如果存在roleManager元素,则其属性cookieRequireSSL="true"也应设置为true。参考 msdn.microsoft.com/en-us/library/...
杰夫默格勒

通过在相关文件中添加以上更改,会话对象在我的应用程序中不起作用,它们变为空。那我该如何纠正这个问题呢?
satya

您正在为应用程序使用HTTP还是HTTPS?在“安全”标志,我们在这里设置防止饼干被送到了未加密(即HTTP)连接
马丁·伊登

21

如果您正在谈论企业环境中的签入代码,事情会很快变得混乱。我们发现最好的方法是让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。


^^^这^^^就是方法。有关更多信息,请
参见

0

secure-此属性告诉浏览器仅在通过安全通道(例如HTTPS)发送请求时才发送cookie。这将有助于防止cookie传递给未加密的请求。如果可以同时通过HTTP和HTTPS访问该应用程序,则可能以明文形式发送cookie。


0

基于@Mark D的答案,我将使用web.config转换将所有各种cookie设置为Secure。这包括设置anonymousIdentification cookieRequireSSLhttpCookies 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 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的原始问题,但是,如果不将其全部设置为安全,则可以预期会有安全扫描工具注意到,并且报告中会出现红旗。问我我怎么知道。:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.