【问题标题】:RedirectToAction causing empty cookie to be set ahead of cookie with values, which results in "lost" cookieRedirectToAction 导致在带有值的 cookie 之前设置空 cookie,从而导致“丢失”cookie
【发布时间】:2019-06-20 00:35:14
【问题描述】:

我正在使用 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("~/");
    }
}

我的 Home 操作如下所示

    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 时,一切正常。有什么想法吗?

编辑

按照建议,我运行了 fiddler。这是请求的样子

#   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/ahApLpF529inJO9mj3jSnoHqG6fthzJpoLYQLQg=C=C; 4%40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc*=P%2ffJD5CdLO0pCGU6GntaPw*=P6QAytlDVUrkQn84c9vDVg*

第二

4%40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc*=; __RequestVerificationToken_Lw__=NNu8v2oTMX2YKQOW+JRN1LQRYPhlmPszQa8Rs1KrQp1pPxWmQO8GG7eRrzbhFZF38p05ckuLHAK3QaTIlxeFJ6POTX1woXRx/ahApLpF529inJO9mj3jSnoHqG6fthzJpoLYQL61NOCCU; 4%40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc*=P%2ffJD5CdLO0pCGU6GntaPw*=P6QAytlDVUrkQn84c9vDVg*

第三

__RequestVerificationToken_Lw__=NNu8v2oTMX2YKQOW+JRN1LQRYPhlmPszQa8Rs1KrQp1pPxWmQO8GG7eRrzbhFZF38p05ckuLHAK3QaTIlxeFJ6POTX1woXRx/ahApLpF529inJO9mj3jSnoHqG6fthzJpoLYQLQg=C=C; 4%40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc*=P%2ffJD5CdLO0pCGU6GntaPw*=P6QAytlDVUrkQn84c9vDVg*

第四

4%40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc*=; __RequestVerificationToken_Lw__=NNu8v2oTMX2YKQOW+JRN1LQRYPhlmPszQa8Rs1KrQp1pPxWmQO8GG7eRrzbhFZF38p05ckuLHAK3QaTIlxeFJ6POTX1woXRx/ahApLpF529inJO9mj3jSnoHqG6fthzJpoLYQL61NOCCU; 4%40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc*=P%2ffJD5CdLO0pCGU6GntaPw*=P6QAytlDVUrkQn84c9vDVg*

这是我在地址栏中输入 /signin 时的样子

__RequestVerificationToken_Lw__=NNu8v2oTMX2YKQOW+JRN1LQRYPhlmPszQa8Rs1KrQp1pPxWmQO8GG7eRrzbhFZF38p05ckuLHAK3QaTIlxeFJ6POTX1woXRx/ahApLpF529inJO9mj3jSnoHqG6fthzJpoLYQLQg=C=C; 4%40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc*=P%2ffJD5CdLO0pCGU6GntaPw*=P6QAytlDVUrkQn84c9vDVg*

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

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

【问题讨论】:

  • 因为它确实如此!可以使用 Server.Transfer 吗?
  • 是否有理由为此使用 cookie?您应该使用内置的完美可行的解决方案。 asp.net/mvc/tutorials/…
  • 不,现在,突然之间,cookie 代码没有任何更改,我的 cookie 不再设置。这令人沮丧。
  • @rboarman - 我正在使用 formsauth cookie 登录。此 cookie 用于跟踪用户。您必须通过重定向 url 从有效的外部来源进入以获取 cookie 集,然后才能登录。
  • 好的,然后我将使用 Fiddler 查看正在发生的请求并查看 cookie 本身。

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


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

在调用 RedirectToAction() 后,我的 cookie 设置不正确。我最终使用了 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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    • 2011-10-22
    • 2019-08-26
    • 2013-12-16
    • 2015-11-27
    • 2013-01-25
    相关资源
    最近更新 更多