Я использую 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, который имеет значение по сравнению с другим, но я бы лучше решил проблему с корнем, что бы это ни было, которое происходит только на странице входа.