重定向操作使导致空cookie的cookie置于cookie之前,这导致“丢失” cookie
-
08-10-2019 - |
题
我正在使用cookie,如果设置了cookie,它将将用户转发到签名,否则它显示了一个错误页面(未经授权)。 cookie的设置正确,如果我通过在地址栏中键入任何页面来导航到任何页面,则可以正常工作。但是,当我使用RedirectToAction或Formauthentication时。Redirecttologin不可用,这会导致无限循环重定向。
主页 - 如果用户有cookie,请转到Signin,如果不显示主页。
SIGNIN-如果用户有cookie,请显示页面,否则重定向到家
我的重定向是通过属性来处理的。
public sealed class RequireBillerAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
IUserSession session = ServiceLocator.Locate<IUserSession>();
if (session.BillerId == 0)
filterContext.Result = new RedirectResult("~/");
}
}
我的家庭行动看起来像这样
public ActionResult Index()
{
//if the user is signed in, send them to their account page. They don't need to see the front page
if (Request.IsAuthenticated)
{
return RedirectToAction("Index", "Account");
}
//users with their cookie set should sign in
if (session.BillerId != 0)
return RedirectToAction("Index", "SignIn");
return View();
}
我的标志行动看起来像这样
[RequireBiller]
public ActionResult Index()
{
SignInModel model = BuildSignInModel();
return View(model);
}
现在,当我达到mysite.com/时,重定向会导致无限循环。在调试中,该属性无法从cookie找到值。 cookie实际上在请求中是空白的。当我键入mysite.com/signin时,一切都可以使用桃红色。有任何想法吗?
编辑
正如建议的,我跑了提琴手。这是请求的样子
# Result Protocol Host URL Body Caching Content-Type Process Comments Custom
1 302 HTTP localhost:27412 / 124 private text/html; charset=utf-8 chrome:6008
2 302 HTTP localhost:27412 /SignIn 118 private text/html; charset=utf-8 chrome:6008
3 302 HTTP localhost:27412 / 124 private text/html; charset=utf-8 chrome:6008
4 302 HTTP localhost:27412 /SignIn 118 private text/html; charset=utf-8 chrome:6008
这是cookie信息
第一的
__RequestVerificationToken_Lw__=NNu8v2oTMX2YKQOW+JRN1LQRYPhlmPszQa8Rs1KrQp1pPxWmQO8GG7eRrzbhFZF38p05ckuLHAK3QaTIlxeFJ6POTX1woXRx/ahApLpF529inJO9mj3jSnoHqG6fthzJpoLYQL61NOCCUO2wwzLmQg==; 4%40F0NKYBBQCTD4G9YL1J8KDNCWDQRPIXREHLUMP2LC*= P%2FFJD5CDLO0PCGU6GNTAPW*= p6qaytldvurkqn84c9vdvg*
第二
4%40F0NKYBBQCTD4G9YL1J8KDNCWDQRPIXREPRUMP2LC*=; __RequestVerificationToken_Lw__=NNu8v2oTMX2YKQOW+JRN1LQRYPhlmPszQa8Rs1KrQp1pPxWmQO8GG7eRrzbhFZF38p05ckuLHAK3QaTIlxeFJ6POTX1woXRx/ahApLpF529inJO9mj3jSnoHqG6fthzJpoLYQL61NOCCUO2wwzLmQg==; 4%40F0NKYBBQCTD4G9YL1J8KDNCWDQRPIXREHLUMP2LC*= P%2FFJD5CDLO0PCGU6GNTAPW*= p6qaytldvurkqn84c9vdvg*
第三
__RequestVerificationToken_Lw__=NNu8v2oTMX2YKQOW+JRN1LQRYPhlmPszQa8Rs1KrQp1pPxWmQO8GG7eRrzbhFZF38p05ckuLHAK3QaTIlxeFJ6POTX1woXRx/ahApLpF529inJO9mj3jSnoHqG6fthzJpoLYQL61NOCCUO2wwzLmQg==; 4%40F0NKYBBQCTD4G9YL1J8KDNCWDQRPIXREHLUMP2LC*= P%2FFJD5CDLO0PCGU6GNTAPW*= p6qaytldvurkqn84c9vdvg*
第四
4%40F0NKYBBQCTD4G9YL1J8KDNCWDQRPIXREPRUMP2LC*=; __RequestVerificationToken_Lw__=NNu8v2oTMX2YKQOW+JRN1LQRYPhlmPszQa8Rs1KrQp1pPxWmQO8GG7eRrzbhFZF38p05ckuLHAK3QaTIlxeFJ6POTX1woXRx/ahApLpF529inJO9mj3jSnoHqG6fthzJpoLYQL61NOCCUO2wwzLmQg==; 4%40F0NKYBBQCTD4G9YL1J8KDNCWDQRPIXREHLUMP2LC*= P%2FFJD5CDLO0PCGU6GNTAPW*= p6qaytldvurkqn84c9vdvg*
这就是我在地址栏中输入 /登录时的样子
__RequestVerificationToken_Lw__=NNu8v2oTMX2YKQOW+JRN1LQRYPhlmPszQa8Rs1KrQp1pPxWmQO8GG7eRrzbhFZF38p05ckuLHAK3QaTIlxeFJ6POTX1woXRx/ahApLpF529inJO9mj3jSnoHqG6fthzJpoLYQL61NOCCUO2wwzLmQg==; 4%40F0NKYBBQCTD4G9YL1J8KDNCWDQRPIXREHLUMP2LC*= P%2FFJD5CDLO0PCGU6GNTAPW*= p6qaytldvurkqn84c9vdvg*
是的,我的饼干被加密了。 Cookiename是“ 4%40F0NKYBBQCTD4G9YL1J8KDNCWDQRPIXREPRUMP2LC*”在我看来,重定向是在其中加入一个新的空cookie。为什么?我不确定。
额外的调试后,我发现请求中确实有3个cookie。第一个是空的cookie,默认情况下使用该名称时会返回。集合中的第三个cookie具有值集。为什么它将此cookie附加到请求中是一个谜。我可能可以通过选择比另一个值具有价值的cookie来解决这个问题,但是我宁愿解决根本问题,无论它是什么,这种问题仅在signin页面上发生。
解决方案
我认为正在发生的事情是,RedirecttoAction正在执行响应。redirect(),它终止了请求的处理,并且不允许设置cookie。听起来像是在此处记录的类似问题:
http://weblogs.asp.net/bleroy/archive/2004/08/03/207486.aspx
其他提示
我有一个cookie在调用RedirectToAction()后无法正确设置。我最终使用了此答案中所述的tempdata []: https://stackoverflow.com/a/3624353/1265197
这是我的代码。帐户字符串是通过名为“帐户”的URL上的查询字符串检索的:
public ActionResult OriginatingAction(string account)
{
//Some other code
TempData["data"] = account;
return RedirectToAction("RedirectAction");
}
然后,我可以使用tempdata [“ data”]在我重定向到的操作中设置cookie:
public ActionResult RedirectAction()
{
if(TempData["data"] != null)
{
HttpCookie dataCookie = new HttpCookie("dataCookie");
dataCookie.Values.Add("account", TempData["data"] as string);
dataCookie.Expires = DateTime.Now.AddHours(12);
Response.Cookies.Add(dataCookie);
}
return View();
}