【问题标题】:Forms authentication with requireSSL=true not returning cookie with Secure attribute使用 requireSSL=true 的表单身份验证不返回具有 Secure 属性的 cookie
【发布时间】:2013-01-10 00:14:18
【问题描述】:

现在我们已经将主机从 Win2K3/IIS6 升级到 Win2k8R2/IIS7.5,我看到来自 IIS 站点的奇怪响应。 ASP.Net 4.0 版

我们有一个非常复杂和成熟的 Web 应用程序,它使用带有以下配置的表单身份验证:

<authentication mode="Forms">
  <forms loginUrl="~/Login" timeout="2000" domain="xx.xx.com" requireSSL="true" />
</authentication>

登录 URL 指向为 SSL 正确配置的 ASP.Net MVC 3 页面。

该站点在 IIS6 中的行为与预期一样,但自从主机迁移后,成功登录后,响应标头中的 auth cookie 缺少 Secure 和 HttpOnly 属性。这是有问题的,因为我们有一个包含许多 HTTP 页面的混合内容站点。 auth cookie 现在在每个请求中发送,而不仅仅是在通过 HTTPS 的请求中,并且现在对会话窃取漏洞开放。

我们的注销链接成功发送了一个包含 Secure 和 HttpOnly 属性的零长度 cookie。

这是从 Fiddler 成功登录和注销后的原始响应,经过编辑以保护无辜者 :)

Login Response:

HTTP/1.1 200 OK
Cache-Control: private
Content-Type: application/json; charset=utf-8
Set-Cookie: .ASPXAUTH=83FCCA...102D; domain=xx.xx.com; path=/
Date: Fri, 25 Jan 2013 22:53:31 GMT
Content-Length: 84

{...}


Logoff Response:

HTTP/1.1 302 Found

Cache-Control: private
Content-Type: text/html; charset=utf-8
Location: http://xx.xx.com/?...
Set-Cookie: .ASPXAUTH=; domain=xx.xx.com; expires=Tue, 12-Oct-1999 04:00:00 GMT; path=/; secure; HttpOnly
Set-Cookie: logoff=; path=/
Set-Cookie: ...
Date: Fri, 25 Jan 2013 22:57:01 GMT
Content-Length: 64053

<html><head><title>...

更改应用程序池的集成管道设置无效。

以下是 cookie 创建代码的重要部分:

    var ctx = HttpContextFactory.Current;

    var cookie = new HttpCookie(
        FormsAuthentication.FormsCookieName,
        FormsAuthentication.Encrypt(
            new FormsAuthenticationTicket(
                SessionId,
                false,
                Convert.ToInt32(FormsAuthentication.Timeout.TotalMinutes)
            )
        )
    ) { Domain = domain };

    ctx.Response.Cookies.Add(cookie);

关于从哪里开始寻找导致这种情况的原因的任何想法?

【问题讨论】:

    标签: asp.net asp.net-mvc iis security


    【解决方案1】:

    当您发出表单身份验证 cookie 时,您所设置的只是域名。我看不到您在任何地方设置安全标志。因此,如果您希望使用安全和 httponly 标志设置 cookie,请确保在创建此 cookie 时已指定它们:

    var cookie = new HttpCookie(
        FormsAuthentication.FormsCookieName,
        FormsAuthentication.Encrypt(
            new FormsAuthenticationTicket(
                SessionId,
                false,
                Convert.ToInt32(FormsAuthentication.Timeout.TotalMinutes)
            )
        )
    ) 
    { 
        Domain = domain,
        HttpOnly = true,
        Secure = FormsAuthentication.RequireSSL
    };
    

    由于您是手动创建表单身份验证 cookie(而不是使用 FormsAuthentication.SetAuthCookieFormsAuthentication.GetAuthCookie 内置方法),因此 web.config 中的设置无效。您需要像我的示例中所示显式设置它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-11
      • 1970-01-01
      • 2013-09-22
      • 2012-08-01
      • 1970-01-01
      • 2018-12-03
      • 2016-01-14
      • 1970-01-01
      相关资源
      最近更新 更多