RedirectToAction заставляет пустой cookie быть установленным перед cookie со значениями, что приводит к «потерянному» cookie - PullRequest
2 голосов
/ 11 ноября 2010

Я использую 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, все работает замечательно. Есть идеи?

EDIT

Как и предполагалось, я запустил скрипач. Вот как выглядят запросы

#   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 

А вот информация о куки

Первый

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

Второй

* * 4 тысячи тридцать-семь% 40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc * =; __RequestVerificationToken_Lw __ = NNu8v2oTMX2YKQOW + JRN1LQRYPhlmPszQa8Rs1KrQp1pPxWmQO8GG7eRrzbhFZF38p05ckuLHAK3QaTIlxeFJ6POTX1woXRx / ahApLpF529inJO9mj3jSnoHqG6fthzJpoLYQL61NOCCUO2wwzLmQg ==; 4% 40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc * = P% 2ffJD5CdLO0pCGU6GntaPw * = P6QAytlDVUrkQn84c9vDVg *

Третий

* +1045 * __ 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 *

Да, мои куки зашифрованы. Cookiename: "4% 40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc *" Мне кажется, что редирект добавляет туда новый пустой файл cookie. ЗАЧЕМ? Я не уверен.

ДОПОЛНИТЕЛЬНЫЙ После отладки я обнаружил, что в запросе действительно есть 3 куки. Первый - пустой cookie, который возвращается по умолчанию при использовании имени. Третий файл cookie в коллекции имеет установленные значения. Почему он добавляет этот файл cookie в запрос, остается загадкой. Вероятно, я могу обойти эту проблему, выбрав файл cookie, который имеет значение по сравнению с другим, но я бы лучше решил проблему с корнем, что бы это ни было, которое происходит только на странице входа.

Ответы [ 2 ]

2 голосов
/ 28 марта 2011

Я думаю, что происходит то, что RedirectToAction выполняет Response.Redirect (), который завершает обработку запроса и не позволяет установить cookie.Похоже, проблема похожа на то, что описано здесь для сессии:

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

0 голосов
/ 19 июня 2019

У меня был файл cookie, который не был установлен должным образом после вызова RedirectToAction ().Я использовал TempData [], как описано в этом ответе: https://stackoverflow.com/a/3624353/1265197

Вот мой код.Строка учетной записи была получена через строку запроса на URL-адресе с именем «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();
}
...