将会话cookie设置为HttpOnly

时间:2016-09-26 16:55:34

标签: c# asp.net asp.net-mvc session cookies

我正在使用Entity Framework 6.0开发ASP.NET MVC服务器。据我所知,它已设置为与EF 4.5(<httpRuntime targetFramework="4.5" />)兼容。

我想确保会话cookie(即存储会话标识符的cookie)是HttpOnly,因为这是一个行业范围的最佳实践,它有助于防止跨站点请求伪造攻击。

问题是,它是由框架自动创建的,因此我无法在调用构造函数后立即更改对象的属性,就像所有其他cookie一样。

Web.config中,我设置了<httpCookies httpOnlyCookies="true" />,然而 - 当我检索会话Cookie时 - HttpOnly(其HttpCookie.HttpOnly属性设置为false)。而且我不太清楚如何改变它。

我无法在微软的Web.config <sessionState>文档中找到任何会改变这种情况的内容。在Stack Overflow上我只找到了a four year old question talking about how session cookie is HttpOnly by default,这对我来说是完全相反的,而a five days old question asking why session cookie is not HttpOnly by default - 由于一些莫名其妙的原因被关闭 - 没有评论 - 作为重复前者。

我知道I can retrieve the session cookie, check it and set HttpOnly=true on every request(或者使用稍微更精致/黑客的过滤器来做这件事,或者在登录时手动设置,或者......),但我不是血 - 野蛮的野蛮人必须有一个正确的方法来做到这一点。

那么,如何将会话cookie设置为HttpOnly?

1 个答案:

答案 0 :(得分:5)

会话Cookie 将始终为 httponly 。您无法修改或覆盖它。

  

当我检索会话cookie时 - 它不是HttpOnly(它的   HttpCookie.HttpOnly属性设置为false)。

var cookie = Request.Cookies["ASP.Net_SessionId"];
if (cookie != null)
{
    var httpOnly = cookie.HttpOnly; // <-- This is always false
}

HttpOnly 值在服务器端始终为false,因为客户端浏览器不会将cookie发送回服务器,无论cookie是否为httponly。

如何验证

您可以使用Cookie编辑器,例如Chrome插件EditThisCookie

enter image description here