2011-05-12 395 views
47

我已经将.ASPXAUTH cookie设置为仅用于https,但我不确定如何有效地对ASP.NET_SessionId执行相同操作。如何保护ASP.NET_SessionId cookie?

整个站点使用HTTPS,因此不需要cookie与http和https协同工作。

+0

【如何庆祝会话Cookie安全(http://anubhavg.wordpress.com/2008/02/05/how-to-mark-session-cookie-secure/) – Pankaj 2011-05-12 13:33:29

回答

37

这里是从blog article written by Anubhav Goyal采取的代码片段:

// this code will mark the forms authentication cookie and the 
// session cookie as Secure. 
if (Response.Cookies.Count > 0) 
{ 
    foreach (string s in Response.Cookies.AllKeys) 
    { 
     if (s == FormsAuthentication.FormsCookieName || s.ToLower() == "asp.net_sessionid") 
     { 
      Response.Cookies[s].Secure = true; 
     } 
    } 
} 

在Global.asax添加此到EndRequest事件处理程序应该做到这一点对所有页面调用。

注意:建议编辑在成功的“安全”分配内添加break;语句。我拒绝了这个编辑,因为它只允许其中一个cookie被强制保护,而第二个将被忽略。添加计数器或其他度量标准以确定两者在此时已被锁定并打破,这是不可想象的。然而,随着新的代码技术,这将可能是更好的写法如下:

Response.Cookies[FormsAuthentication.FormsCookieName]?.Secure = true; 
Response.Cookies["asp.net_sessionid"]?.Secure = true; 
+4

完美,谢谢。对于读者来说,这可能会让人觉得它看起来像一个狡猾的变通办法,就像我第一次看到它时那样,我还没有发现任何暗示有更好的选择的东西,这看起来工作得很好! – Pete 2011-05-13 08:58:15

+1

请注意,sessionState cookie名称可能不总是'ASP.NET_SessionId'。它可以被覆盖http://msdn.microsoft.com/en-us/library/h6bb9cz9.aspx – kenwarner 2011-06-09 03:04:53

+0

@qntmfred:你提供的链接不再可用。你能提供一些搜索提示,所以我可以找到原始的微软文章吗? – Matt 2014-10-06 10:48:56

-2

如果整个站点使用HTTPS,那么sessionId cookie至少与HTTPS加密一样安全。这是因为cookie是作为HTTP标头发送的,使用SSL时,HTTP标头在传输时使用SSL进行加密。

+11

记住尽管这如果用户将URL输入浏览器“www.securesite.com”,那么对该服务器的初始请求(包括任何cookie)将是不安全的;服务器大概会回应一个重定向到SSL站点,之后你是正确的。 – 2011-05-12 14:20:29

+2

这是有道理的,但不幸的是,我们客户使用的测试人员不会这样看待它:) – Pete 2011-05-13 08:58:10

+0

“HTTP头在传输时使用SSL进行加密”是否意味着该通道已加密或实际的Cookie内容是否已加密? – 2011-05-25 19:05:07

114

要将; secure后缀添加到Set-Cookie HTTP头我只是用在web.config中<httpCookies>元素:

<system.web> 
    <httpCookies httpOnlyCookies="true" requireSSL="true" /> 
<system.web> 

恕我直言,比在Anubhav Goyal的文章中写代码更方便。

参见:http://msdn.microsoft.com/en-us/library/ms228262(v=vs.100).aspx

+2

http://msdn.microsoft.com/en-us/library/ms228262(v=vs.100).aspx(此MSDN主题目前不适用于.NET 4.5。) – 2012-11-07 20:59:23

+4

Marcel Hoyer,我试过了方法,但不知何故,它只是不起作用。 'asp.net_sessionid'仍然不是'secure'。您的方法是否适用于MVC Web应用程序? – Blaise 2013-05-15 18:42:01

+0

@Blaise,我没有尝试这个MVC的Web应用程序。还有其他人吗? – 2013-05-15 22:38:30

6

发现在Sess中设置安全属性ion_Start就足够了,正如MSDN博客“Securing Session ID: ASP/ASP.NET”中推荐的那样。

protected void Session_Start(Object sender, EventArgs e) 
    { 
     SessionStateSection sessionState = 
(SessionStateSection)ConfigurationManager.GetSection("system.web/sessionState"); 
     string sidCookieName = sessionState.CookieName; 

     if (Request.Cookies[sidCookieName] != null) 
     { 
      HttpCookie sidCookie = Response.Cookies[sidCookieName]; 
      sidCookie.Value = Session.SessionID; 
      sidCookie.HttpOnly = true; 
      sidCookie.Secure = true; 
      sidCookie.Path = "/"; 
     } 
    }