RedirectToAction导致空cookie在值之前设置在cookie之前,这会导致“丢失”cookie

时间:2010-11-11 17:43:26

标签: c# asp.net-mvc-2 redirect httpcookie

我正在使用cookie,如果设置了cookie,它会转发用户登录,否则会向他们显示错误页面(未经授权)。正确设置了cookie,如果我通过在地址栏中输入来导航到任何页面,它就可以正常工作。但是,当我使用RedirectToAction或FormsAuthentication.RedirectToLogin时,cookie不可用,这导致重定向无限循环。

主页 - 如果用户有cookie,请转到登录,如果没有显示主页。

登录 - 如果用户有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%40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc * = P%2ffJD5CdLO0pCGU6GntaPw * = P6QAytlDVUrkQn84c9vDVg *

第二

  

4%40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc * =;   __RequestVerificationToken_Lw __ = NNu8v2oTMX2YKQOW + JRN1LQRYPhlmPszQa8Rs1KrQp1pPxWmQO8GG7eRrzbhFZF38p05ckuLHAK3QaTIlxeFJ6POTX1woXRx / ahApLpF529inJO9mj3jSnoHqG6fthzJpoLYQL61NOCCUO2wwzLmQg ==;   4%40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc * = P%2ffJD5CdLO0pCGU6GntaPw * = P6QAytlDVUrkQn84c9vDVg *

第三

  

__ RequestVerificationToken_Lw __ = NNu8v2oTMX2YKQOW + JRN1LQRYPhlmPszQa8Rs1KrQp1pPxWmQO8GG7eRrzbhFZF38p05ckuLHAK3QaTIlxeFJ6POTX1woXRx / ahApLpF529inJO9mj3jSnoHqG6fthzJpoLYQL61NOCCUO2wwzLmQg ==;   4%40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc * = P%2ffJD5CdLO0pCGU6GntaPw * = P6QAytlDVUrkQn84c9vDVg *

  

4%40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc * =;   __RequestVerificationToken_Lw __ = NNu8v2oTMX2YKQOW + JRN1LQRYPhlmPszQa8Rs1KrQp1pPxWmQO8GG7eRrzbhFZF38p05ckuLHAK3QaTIlxeFJ6POTX1woXRx / ahApLpF529inJO9mj3jSnoHqG6fthzJpoLYQL61NOCCUO2wwzLmQg ==;   4%40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc * = P%2ffJD5CdLO0pCGU6GntaPw * = P6QAytlDVUrkQn84c9vDVg *

这就是我输入/登录地址栏时的样子

  

__ RequestVerificationToken_Lw __ = NNu8v2oTMX2YKQOW + JRN1LQRYPhlmPszQa8Rs1KrQp1pPxWmQO8GG7eRrzbhFZF38p05ckuLHAK3QaTIlxeFJ6POTX1woXRx / ahApLpF529inJO9mj3jSnoHqG6fthzJpoLYQL61NOCCUO2wwzLmQg ==;   4%40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc * = P%2ffJD5CdLO0pCGU6GntaPw * = P6QAytlDVUrkQn84c9vDVg *

是的,我的cookie已加密。 cookiename是“4%40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc *”在我看来重定向是在那里附加一个新的空cookie。为什么?我不确定。

其他 调试后,我发现请求中确实有3个cookie。第一个是空cookie,默认情况下在使用名称时返回。集合中的第三个cookie具有设置的值。为什么将此cookie附加到请求中是一个谜。我可以通过选择具有超过另一个的值的cookie来解决这个问题,但我宁愿修复根本问题,无论它是什么,只发生在登录页面上。

2 个答案:

答案 0 :(得分:2)

我认为正在发生的事情是RedirectToAction正在执行一个Response.Redirect(),它正在终止请求的处理并且不允许设置cookie。听起来像会话中记录的类似问题:

http://weblogs.asp.net/bleroy/archive/2004/08/03/207486.aspx

答案 1 :(得分:0)

在调用RedirectToAction()之后,我有一个cookie设置不正确。我最终如以下答案所述使用了TempData []:https://stackoverflow.com/a/3624353/1265197

这是我的代码。帐户字符串是通过名为“ account”的网址上的查询字符串检索的:

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();
}