ASP.NET MVC AuthorizeAttribute允许未经授权的购物者

时间:2014-07-24 08:03:39

标签: asp.net-mvc security asp.net-mvc-4 cookies authorize-attribute

我们有一个ASP.NET MVC4 Web应用程序,在我们的QA环境中,我们在同一个网站上设置了不同的“网站”作为WebApplications,例如。

www.mysite.co.uk/WebApp1
www.mysite.co.uk/WebApp2
www.mysite.co.uk/WebApp3

对于我们所有的cookie,我们确保cookie密钥包含一个将该cookie与特定Web应用程序相关联的ID,因此没有交叉污染。

现在这一切在绝大部分时间都非常有效。但是,偶尔在我们的DEV环境中,我们发现GUEST购物者(未经过身份验证)可以访问控制器的Action方法,该方法标有[Authorize]属性。

我的猜测这里是浏览器已经与多个TABS一起使用,每个TABS指向一个不同的Web应用程序,有时浏览器/服务器对使用哪个ASPXAUTH cookie感到困惑,并且正在使用来自不同Web应用程序的一个用于已经过身份验证的购物者。正如我所说,这只是一个猜测,但通过调试网站,我们肯定会在代码中找到一个断点,该代码应该被这个属性保护。

目前尚不清楚如何防止这种行为。

由于

格里夫

1 个答案:

答案 0 :(得分:0)

  

对于我们所有的cookie,我们确保cookie密钥包含一个将该cookie与特定Web应用程序相关联的ID,因此没有交叉污染

您正在将ID存储在自定义Cookie中,但您似乎并未将其存储在ASP.NET用于授予对标有[Authorize]属性的代码的访问权限的auth cookie中。

您可以将ID添加到存储在auth cookie中的加密令牌中,并根据请求进行检查,或者您可以使用每个站点的不同密钥加密令牌。

幸运的是,FormsAuthenticationTicket constructor包含一个userdata参数,可用于自定义数据。

 public FormsAuthenticationTicket(
    int version,
    string name,
    DateTime issueDate,
    DateTime expiration,
    bool isPersistent,
    string userData
)

您可以follow this guide使用JSON格式轻松存储多条信息,如下所示: -

public static class HttpResponseBaseExtensions
{
    public static int SetAuthCookie<T>(this HttpResponseBase responseBase, string name, bool rememberMe, T userData)
    {
        /// In order to pickup the settings from config, we create a default cookie and use its values to create a 
        /// new one.
        var cookie = FormsAuthentication.GetAuthCookie(name, rememberMe);
        var ticket = FormsAuthentication.Decrypt(cookie.Value);

        var newTicket = new FormsAuthenticationTicket(ticket.Version, ticket.Name, ticket.IssueDate, ticket.Expiration,
            ticket.IsPersistent, userData.ToJson(), ticket.CookiePath);
        var encTicket = FormsAuthentication.Encrypt(newTicket);

        /// Use existing cookie. Could create new one but would have to copy settings over...
        cookie.Value = encTicket;

        responseBase.Cookies.Add(cookie);

        return encTicket.Length;
    }
}

您还应该为每个网站提供此Cookie的自定义名称,以便它们可以在您的DEV环境中共存。