首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用requireSSL=true的窗体身份验证不返回带有安全属性的cookie

使用requireSSL=true的窗体身份验证不返回带有安全属性的cookie
EN

Stack Overflow用户
提问于 2013-01-25 23:18:11
回答 1查看 12.7K关注 0票数 12

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

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

代码语言:javascript
复制
<authentication mode="Forms">
  <forms loginUrl="~/Login" timeout="2000" domain="xx.xx.com" requireSSL="true" />
</authentication>

Login指向正确配置为SSL的ASP.Net MVC 3页。

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

我们的注销链接成功地发送了包含安全和HttpOnly属性的零长度cookie。

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

代码语言:javascript
复制
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>...

更改app池的集成管道设置没有任何影响。

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

代码语言:javascript
复制
    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);

对从哪里开始找是什么原因有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-26 17:50:04

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

代码语言:javascript
复制
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中的设置没有任何效果。您需要显式地设置它们,如我的示例所示。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14531853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档