【发布时间】:2013-10-15 14:44:50
【问题描述】:
在我们的应用程序中有两种类型的用户,我们称他们为Alpha 和Beta 用户。这些用户中的每一个都会看到不同类型的工具栏/菜单。
我们决定使用 cookie 来跟踪这一点。我们的大部分页面要么是Alpha 页面,要么是Beta 页面,还有一些Alpha 和Beta 用户共享的常见页面。因此,在我们知道用户类型(Alpha 或 Beta)的应用程序的每个视图中,我们都有以下代码:
HttpCookie isAlphaCookie = new HttpCookie("IsAlpha", "false"); // or true
HttpCookie isBetaCookie = new HttpCookie("IsBeta", "true"); // or false
isAlphaCookie.Expires = DateTime.MaxValue;
isBetaCookie.Expires = DateTime.MaxValue;
Response.Cookies.Add(isAlphaCookie);
Response.Cookies.Add(isBetaCookie);
这样的想法是,在普通页面中,我们不设置任何 cookie,而是依靠先前设置的 cookie 来确定要加载哪个工具栏。因此,这两个 cookie 在我们已知页面中设置为true 或false,然后我们在控制器方法中读取它们,该方法加载我们的工具栏,如下所示:
HeaderViewModel header = new HeaderViewModel
{
FirstName = UserProfile.CurrentUser.FirstName,
LastName = UserProfile.CurrentUser.LastName,
ImageUrl = null,
OrganisationName = UserProfile.CurrentUser.OrganisationName,
OrganisationUrl = UserProfile.CurrentUser.OrganisationUrl,
ShowAlphaToolbar = bool.Parse(Request.Cookies["IsAlpha"].Value),
ShowBetaToolbar = bool.Parse(Request.Cookies["IsBeta"].Value),
ShowPublicToolbar = false
};
return PartialView("Common/_Header", header);
从阅读如何读取/写入 cookie 来看,这似乎是正确的方法;将cookie写入Response对象并从Request对象读取cookie。
我遇到的问题是,当我进入加载工具栏的控制器方法时,IsAlpha 和 IsBeta cookie 的值都是空字符串,这会破坏应用程序。
我已确认 cookie 在Request 中读取之前已设置在Response 中。
我想知道我是否在这里遗漏了一些基本的东西。
【问题讨论】:
-
尝试使用一些浏览器工具或 Fiddler 来查看 cookie 是否真的被浏览器存储并在请求期间发送回服务器。
-
如何调用包含工具栏的部分操作?通过 ajax 还是通过 @Html.RenderAction()?
-
检查 cookie 中设置的
ExpiryDate。 -
@Ankit 工具栏使用
@Html.Action("LoadHeader", "Profile")加载。如果这对我不起作用,您能建议一种替代方法吗? -
您会保护这些cookies吗?根据您上面所说,用户更改 cookie 值并更改其用户类型将是微不足道的。看看加密字符串,或者给它添加一个 MAC,这样它就不会被篡改。
标签: c# asp.net-mvc cookies