我们有一个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应用程序的一个用于已经过身份验证的购物者。正如我所说,这只是一个猜测,但通过调试网站,我们肯定会在代码中找到一个断点,该代码应该被这个属性保护。
目前尚不清楚如何防止这种行为。
由于
格里夫
答案 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环境中共存。