卸载SSL时保护表单身份验证Cookie

时间:2010-10-28 13:00:17

标签: asp.net-mvc security forms-authentication

我正在尝试使用ASP.NET MVC 2.0和表单身份验证来保护我正在开发的网站。为了保护表单身份验证cookie,我想将requiresSSL属性设置为true,这样只有当连接在SSL下时才由浏览器发送cookie,显然确保所有需要授权的资源都在SSL下。

我的问题是我们正在使用应用程序请求路由来实现许多功能,一个是SSL卸载,因此当请求到达我们服务器场中的任何Web服务器时,请求不再是SSL和FormsAuthentication.SetAuthCookie方法失败,因为在指定requiresSSL时需要SSL连接来设置cookie。

任何人都对这里的工作有任何想法!

由于

2 个答案:

答案 0 :(得分:3)

所以我有一个解决这个问题的方法,但如果有人有任何更好的想法,请随时发表评论。基本上,您需要在请求结束时拦截响应并在表单身份验证cookie上手动设置Secure属性,非常明显,您还需要将表单身份验证配置中的requireSSL属性设置为false。另外请记住,我们不希望为经过身份验证的用户启用整个站点的HTTPS,因此可以解决此问题。

这种方法有一些注意事项,需要注意一些事项。

  1. 我在测试期间发现表单身份验证cookie总是写在响应中,因此我在浏览器中用一个空的身份验证cookie覆盖了有效的身份验证cookie,为了解决这个问题,我在其中包含了一些逻辑。要解决此问题的HTTP模块,请参阅下面的代码段。

  2. 所有需要授权的应用程序请求必须使用SSL,否则请求将不包含身份验证cookie以验证用户身份。

  3. 因为您只传递SSL请求的身份验证cookie,所以您需要另一种机制来告诉您的应用程序,当他们浏览网站的非SSL区域时,当前用户已经过身份验证,我已经实现了这一点当用户登录时设置的cookie,并且没有设置过期日期,因此将在用户会话结束时到期,当然如果用户退出,该cookie将被删除。

  4. 以下是在HTTP模块中实现的影响上述内容的逻辑,我在过去几个小时内一直在测试它并且还没有遇到任何问题,如果我这样做,我一定会更新这篇文章!


    如果用户刚刚登录了逻辑,我们应该只向客户端发送身份验证cookie

    1. 如果请求具有auth cookie,则用户已经过身份验证 并且在SSL下,以确保我们不会在中发送新的身份验证cookie 响应。
    2. 如果请求没有auth cookie,但有效 响应中的auth cookie,将响应auth cookie设置为secure, 所以它只能由SSL下的浏览器传输。
    3. 如果请求没有auth cookie且响应有 无效或空的身份验证cookie,请确保我们删除响应cookie 所以我们不要在客户端浏览器中覆盖有效的cookie。
    4. private void EndRequest(object sender, EventArgs e)
      {
          var application = (HttpApplication)sender;
      
          if (ValidRequest(application.Request) && application.Response.Cookies.Count > 0)
          {
      
              //only do the below if the user is not logging out the site, if the user is logging out we can 
              //leave the default forms authentication behaviour which is to expire the auth cookie
              if (application.Request.AppRelativeCurrentExecutionFilePath != "~/authentication/logoff")
              {
                  var requestAuthCookie = application.Request.Cookies[FormsAuthentication.FormsCookieName];
                  var responseAuthCookie = application.Response.Cookies[FormsAuthentication.FormsCookieName];
      
                  if (requestAuthCookie != null && responseAuthCookie != null && responseAuthCookie.Value.IsNullOrEmpty())
                  {
                      application.Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
                  }
                  else if (responseAuthCookie != null && !responseAuthCookie.Value.IsNullOrEmpty())
                  {
                      responseAuthCookie.Secure = true;
                      application.Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
                      application.Response.Cookies.Add(responseAuthCookie);
                  }
                  else if (responseAuthCookie == null || responseAuthCookie.Value.IsNullOrEmpty())
                  {
                      application.Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
                  }
              }
          }
      }
      

答案 1 :(得分:2)

SSL offload应该允许您从SSL卸载程序到Web服务器建立SSL连接。

从SSL卸载程序到Web服务器的SSL连接应使用最轻和最快(可能最弱)的加密。

这允许您使用安全cookie,减少服务器上的加密负载并避免修改代码。