RedirectToactaction, вызывая установить пустое печенье впереди cookie со значениями, что приводит к «потерянному» печению

StackOverflow https://stackoverflow.com/questions/4157465

Вопрос

Я использую файл cookie, и если настроен файл cookie, он пересылает пользователю для входа в систему, иначе он показывает им страницу ошибки (несанкционированная). Печенье устанавливается правильно, и если я перейду на любую страницу, набрав ее в адресной строке, он работает просто отлично. Однако, когда я использую RedirectToaction или Findauthauthentication.redirectttologin Печенье не доступно, что вызывает бесконечный петли в перенаправлении.

Главная - Если пользователь имеет 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. Печенье фактически пустое в запросе. Когда я нахожу 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

Первый

__RequestvericationToken_LW __ = nnu8v2otmx2ykqow + jrn1lqryphlmpszqa8rs1krqp1pxwmqo8gg7errzbhfzf38p05ckulhak3qatilxefh6potx1woxrx / ahaplpf529injo9mj3jsnohqg6fthzjpolyql61noccuo2wwzzjplmqg ==; 4% 40f0nkybbqctd4g9yl1j8kdncwdqrpixreohlump2lc * = p% 2ffjd5cdlo0pcgu6gntapw *= P6qaytldvurkqn84c9vdvg.*

Второй

4% 40F0NKYBBQCTD4G9YL1J8KDNCWDQRPIXREOHLUMP2LC * =; __RequestvericationToken_LW __ = nnu8v2otmx2ykqow + jrn1lqryphlmpszqa8rs1krqp1pxwmqo8gg7errzbhfzf38p05ckulhak3qatilxefh6potx1woxrx / ahaplpf529injo9mj3jsnohqg6fthzjpolyql61noccuo2wwzzjplmqg ==; 4% 40f0nkybbqctd4g9yl1j8kdncwdqrpixreohlump2lc * = p% 2ffjd5cdlo0pcgu6gntapw *= P6qaytldvurkqn84c9vdvg.*

В третьих

__RequestvericationToken_LW __ = nnu8v2otmx2ykqow + jrn1lqryphlmpszqa8rs1krqp1pxwmqo8gg7errzbhfzf38p05ckulhak3qatilxefh6potx1woxrx / ahaplpf529injo9mj3jsnohqg6fthzjpolyql61noccuo2wwzzjplmqg ==; 4% 40f0nkybbqctd4g9yl1j8kdncwdqrpixreohlump2lc * = p% 2ffjd5cdlo0pcgu6gntapw *= P6qaytldvurkqn84c9vdvg.*

Четвертый

4% 40F0NKYBBQCTD4G9YL1J8KDNCWDQRPIXREOHLUMP2LC * =; __RequestvericationToken_LW __ = nnu8v2otmx2ykqow + jrn1lqryphlmpszqa8rs1krqp1pxwmqo8gg7errzbhfzf38p05ckulhak3qatilxefh6potx1woxrx / ahaplpf529injo9mj3jsnohqg6fthzjpolyql61noccuo2wwzzjplmqg ==; 4% 40f0nkybbqctd4g9yl1j8kdncwdqrpixreohlump2lc * = p% 2ffjd5cdlo0pcgu6gntapw *= P6qaytldvurkqn84c9vdvg.*

И вот что похоже, когда я ввожу / вписываю в адресную строку

__RequestvericationToken_LW __ = nnu8v2otmx2ykqow + jrn1lqryphlmpszqa8rs1krqp1pxwmqo8gg7errzbhfzf38p05ckulhak3qatilxefh6potx1woxrx / ahaplpf529injo9mj3jsnohqg6fthzjpolyql61noccuo2wwzzjplmqg ==; 4% 40f0nkybbqctd4g9yl1j8kdncwdqrpixreohlump2lc * = p% 2ffjd5cdlo0pcgu6gntapw *= P6qaytldvurkqn84c9vdvg.*

Да, мое печенье зашифровано. Cookiename - «4% 40F0NKYBBQCTD4G9YL1J8KDNCWDQRPIXREOHLUMP2LC *», - мне кажется, перенаправления представляет собой новое пустое печенье там. ЗАЧЕМ? Я не уверен.

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

Это было полезно?

Решение

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

http://weblogs.ass.asp.net/blleroy/Archive/2004/08/03/207486.aspx.

Другие советы

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

Вот мой код. Строка учетной записи была получена с помощью строки запроса на URL-адрес «учетной записи»:

public ActionResult OriginatingAction(string account)
{
    //Some other code
    TempData["data"] = account; 

    return RedirectToAction("RedirectAction");
}

Затем я мог использовать Tempdata [«данные»], чтобы установить файл 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();
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top