我正在使用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("~/");
}
}
我的主页操作看起来像这样
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时,一切都工作得很好。有什么想法吗?
修改
按照建议,我跑了小提琴手。这是请求的样子
# 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 / 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 *
四
4%40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc * =; __RequestVerificationToken_Lw __ = NNu8v2oTMX2YKQOW + JRN1LQRYPhlmPszQa8Rs1KrQp1pPxWmQO8GG7eRrzbhFZF38p05ckuLHAK3QaTIlxeFJ6POTX1woXRx / ahApLpF529inJO9mj3jSnoHqG6fthzJpoLYQL61NOCCUO2wwzLmQg ==; 4%40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc * = P%2ffJD5CdLO0pCGU6GntaPw * = P6QAytlDVUrkQn84c9vDVg *
这就是我输入/登录地址栏时的样子
__ RequestVerificationToken_Lw __ = NNu8v2oTMX2YKQOW + JRN1LQRYPhlmPszQa8Rs1KrQp1pPxWmQO8GG7eRrzbhFZF38p05ckuLHAK3QaTIlxeFJ6POTX1woXRx / ahApLpF529inJO9mj3jSnoHqG6fthzJpoLYQL61NOCCUO2wwzLmQg ==; 4%40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc * = P%2ffJD5CdLO0pCGU6GntaPw * = P6QAytlDVUrkQn84c9vDVg *
是的,我的cookie已加密。 cookiename是“4%40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc *”在我看来重定向是在那里附加一个新的空cookie。为什么?我不确定。
其他 调试后,我发现请求中确实有3个cookie。第一个是空cookie,默认情况下在使用名称时返回。集合中的第三个cookie具有设置的值。为什么将此cookie附加到请求中是一个谜。我可以通过选择具有超过另一个的值的cookie来解决这个问题,但我宁愿修复根本问题,无论它是什么,只发生在登录页面上。
答案 0 :(得分:2)
我认为正在发生的事情是RedirectToAction正在执行一个Response.Redirect(),它正在终止请求的处理并且不允许设置cookie。听起来像会话中记录的类似问题:
http://weblogs.asp.net/bleroy/archive/2004/08/03/207486.aspx
答案 1 :(得分:0)
在调用RedirectToAction()之后,我有一个cookie设置不正确。我最终如以下答案所述使用了TempData []:https://stackoverflow.com/a/3624353/1265197
这是我的代码。帐户字符串是通过名为“ 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();
}