代码之家  ›  专栏  ›  技术社区  ›  Josh

RedirectToAction导致空cookie设置在具有值的cookie之前,这将导致“丢失”cookie

  •  2
  • Josh  · 技术社区  · 14 年前

    我正在使用cookie,如果设置了cookie,它会将用户转发到signin,否则会显示一个错误页(未经授权)。cookie设置正确,如果我通过在地址栏中键入它来导航到任何页面,它都可以正常工作。但是,当我使用RedirectToAction或FormsAuthentication.RedirectToLogin时,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 
    

    这是饼干的信息

    __请求验证肯Lw=NNu8v2oTMX2YKQOW+JRN1LQRYPhlmPszQa8Rs1KrQp1pPxWmQO8GG7eRrzbhFZF38p05ckuLHAK3QaTIlxeFJ6POTX1woXRx/ahaplppf529injo9mj3jsnohqg6fthzjpolyql61noccu2wwzlmqg==; 4%40f0nkybqctd4g9yl1j8kdncwdqrpixreohlump2lc*=P%2ffJD5CdLO0pCGU6GntaPw* =P6QAytlDVUrkQn84c9vDVg

    第二

    4%40f0nkybqctd4g9yl1j8kdncwdqrpixreohlump2lc*=; 4%40f0nkybqctd4g9yl1j8kdncwdqrpixreohlump2lc*=P%2ffJD5CdLO0pCGU6GntaPw* *

    第三

    4%40f0nkybqctd4g9yl1j8kdncwdqrpixreohlump2lc*=P%2ffJD5CdLO0pCGU6GntaPw* =P6QAytlDVUrkQn84c9vDVg *

    第四

    4%40f0nkybqctd4g9yl1j8kdncwdqrpixreohlump2lc*=; __请求验证肯Lw=NNu8v2oTMX2YKQOW+JRN1LQRYPhlmPszQa8Rs1KrQp1pPxWmQO8GG7eRrzbhFZF38p05ckuLHAK3QaTIlxeFJ6POTX1woXRx/ahaplppf529injo9mj3jsnohqg6fthzjpolyql61noccu2wwzlmqg==; 4%40f0nkybqctd4g9yl1j8kdncwdqrpixreohlump2lc*=P%2ffJD5CdLO0pCGU6GntaPw* *

    下面是我在地址栏中输入/登录时的样子

    __请求验证肯Lw=NNu8v2oTMX2YKQOW+JRN1LQRYPhlmPszQa8Rs1KrQp1pPxWmQO8GG7eRrzbhFZF38p05ckuLHAK3QaTIlxeFJ6POTX1woXRx/ahaplppf529injo9mj3jsnohqg6fthzjpolyql61noccu2wwzlmqg==; =P6QAytlDVUrkQn84c9vDVg

    是的,我的饼干是加密的。cookiename是“4%40f0nkybqctd4g9yl1j8kdncwdqrpixreohlump2lc*”在我看来,重定向在其中附加了一个新的空cookie。为什么?我不确定。

    附加 经过调试,我发现请求中确实有3个cookie。第一个是空cookie,在使用名称时默认返回。集合中的第三个cookie设置了值。为什么要在请求中附加这个cookie是个谜。我可能可以通过选择一个比另一个更有价值的cookie来解决这个问题,但是我宁愿解决根问题,不管它是什么,它只发生在登录页面上。

    1 回复  |  直到 14 年前
        1
  •  3
  •   Guy    13 年前

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

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

        2
  •  0
  •   drobbinso    5 年前

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

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