RedirectToactaction, вызывая установить пустое печенье впереди cookie со значениями, что приводит к «потерянному» печению
-
08-10-2019 - |
Вопрос
Я использую файл 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();
}