ASPXAUTH Cookie的安全标志

时间:2014-01-15 08:58:03

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

我们有一个面向外部的应用程序,由外部安全公司进行渗透测试。应用程序已在ASP.NET MVC4上开发并在IIS8 / Windows 2012 Server上运行。

报告的漏洞之一是ASPXAUTH不安全。当我检查cookie检查器时,有一些带有安全标志的cookie。但ASPXAUTH不是其中之一。

我做了一些研究,并在web.config上设置了以下标志

<forms loginUrl="~/Account/Login" timeout="2880"  requireSSL=""  name="AppName" />

<httpCookies httpOnlyCookies="true" requireSSL="true" />

尽管有这些设置,但身份验证Cookie未标记为安全。我认为这些标志应该足以将应用程序cookie标记为安全,但是还有一些其他cookie也没有标记为安全。我不太关心它们,因为它们不包含任何敏感信息。但我想将ASPXAUTH标记为安全。

我的问题是,

  1. 在web.config上设置了这些标志,ASPXAUTH没有安全标志是否存在安全问题?
  2. 如果是这样,你能否告诉我将其标记为安全的正确方法。
  3. 感谢。

4 个答案:

答案 0 :(得分:7)

我发现这段代码使我的身份验证cookie安全。我不记得这个的来源,但如果你把它添加到你的global.asax,它就会对问题进行排序。我不知道为什么但是你的标签中的requireSSL = true不足以使其安全。

  protected void Application_EndRequest(Object sender, EventArgs e)
    {
        string authCookie = FormsAuthentication.FormsCookieName;

        foreach (string sCookie in Request.Cookies)
        {
            if (sCookie.Equals(authCookie))
            {
                // Set the cookie to be secure. Browsers will send the cookie
                // only to pages requested with https
                var httpCookie = Response.Cookies[sCookie];
                if (httpCookie != null) httpCookie.Secure = true;
            }
        }
    }

答案 1 :(得分:6)

您的问题似乎是因为您的表单配置不正确。你有:

<forms ... requireSSL="" ... />

你应该

<forms ... requireSSL="true" ... />

根据MicrosoftrequireSSL标记中的httpCookies属性被requireSSL标记的forms属性覆盖。您没有设置该值,但是您指定它可能会导致IIS使用默认值false。您应该将其设置为true

答案 2 :(得分:0)

回答第二个问题

How to secure .ASPXAUTH token

可能重复

根据xelco的回答

To prevent forms authentication cookies from being captured and tampered with while crossing the network, ensure that you use SSL with all pages that require authenticated access and restrict forms authentication tickets to SSL channels by setting requireSSL="true" on the <forms> element.

To restrict forms authentication cookies to SSL channels set requireSSL="true" on the <forms> element, as shown in the following code:

<forms loginUrl="Secure\Login.aspx" requireSSL="true" ... />

By setting requireSSL="true", you set the secure cookie property that determines whether browsers should send the cookie back to the server. With the secure property set, the cookie is sent by the browser only to a secure page that is requested using an HTTPS URL.

答案 3 :(得分:0)

对AnarchistGeek答案的一种更改:您不想直接遍历Request.Cookies,因为通过使用响应集合添加cookie会使cookie在请求集合中立即可用(请参见HttpRequest.Cookies文档中的注释{ {3}})。当您设置/更改响应.ASPXAUTH cookie时,这将给您留下“实例化枚举器后修改集合”的错误,因为它也在修改请求集合。

protected void Application_EndRequest(Object sender, EventArgs e)
{
    string authCookie = FormsAuthentication.FormsCookieName;
    string[] cookieNames = Request.Cookies.AllKeys;

    foreach (string sCookie in cookieNames)
    {
        if (sCookie.Equals(authCookie))
        {
            var httpCookie = Response.Cookies[sCookie];
            if (httpCookie != null) httpCookie.Secure = true;
        }
    }
}

请注意,此特定解决方案将清除.ASPXAUTH cookie的现有值(请参见此here