RedirectToActionの原因で空のCookieを値でCookieより先に設定し、「Lost」Cookieになります
-
08-10-2019 - |
質問
私はCookieを使用しており、Cookieが設定されている場合、ユーザーがサインインするように転送します。 Cookieは正しく設定されており、アドレスバーで入力してページに移動すると、正常に機能します。ただし、RedirectToActionまたはformSauthentication.redirecttoginを使用すると、Cookieは使用できません。これにより、リダイレクトで無限のループが発生します。
ホーム - ユーザーが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情報です
初め
__RequestVerificationToken_lw __ = nnu8v2otmx2ykow+jrn1lqryphlmpszqa8rs1krqp1ppxwmqo8gg77errzbhfzf38p05culhak3qatilxefj6potx1wxfpffpffpffpfpfpfpfpfpfpfpfpfppfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfppxwmspxwmQo8gg77erzbhfzfzf38p05culhak3 4%40F0NKYBBQCTD4G9YL1J8KDNCWDQRPIXREOHLUMP2LC*= P%2FFJD5CDLO0PCGU6GNTAPW*= p6qaytldvurkqn84c9vdvg*
2番
4%40F0NKYBBQCTD4G9YL1J8KDNCWDQRPIXREOHLUMP2LC*=; __RequestVerificationToken_lw __ = nnu8v2otmx2ykow+jrn1lqryphlmpszqa8rs1krqp1ppxwmqo8gg77errzbhfzf38p05culhak3qatilxefj6potx1wxfpffpffpffpfpfpfpfpfpfpfpfpfppfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfppxwmspxwmQo8gg77erzbhfzfzf38p05culhak3 4%40F0NKYBBQCTD4G9YL1J8KDNCWDQRPIXREOHLUMP2LC*= P%2FFJD5CDLO0PCGU6GNTAPW*= p6qaytldvurkqn84c9vdvg*
第3
__RequestVerificationToken_lw __ = nnu8v2otmx2ykow+jrn1lqryphlmpszqa8rs1krqp1ppxwmqo8gg77errzbhfzf38p05culhak3qatilxefj6potx1wxfpffpffpffpfpfpfpfpfpfpfpfpfppfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfppxwmspxwmQo8gg77erzbhfzfzf38p05culhak3 4%40F0NKYBBQCTD4G9YL1J8KDNCWDQRPIXREOHLUMP2LC*= P%2FFJD5CDLO0PCGU6GNTAPW*= p6qaytldvurkqn84c9vdvg*
第4
4%40F0NKYBBQCTD4G9YL1J8KDNCWDQRPIXREOHLUMP2LC*=; __RequestVerificationToken_lw __ = nnu8v2otmx2ykow+jrn1lqryphlmpszqa8rs1krqp1ppxwmqo8gg77errzbhfzf38p05culhak3qatilxefj6potx1wxfpffpffpffpfpfpfpfpfpfpfpfpfppfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfppxwmspxwmQo8gg77erzbhfzfzf38p05culhak3 4%40F0NKYBBQCTD4G9YL1J8KDNCWDQRPIXREOHLUMP2LC*= P%2FFJD5CDLO0PCGU6GNTAPW*= p6qaytldvurkqn84c9vdvg*
そして、これが私がアドレスバーに入力 /サインインを入力したときのように見えるものです
__RequestVerificationToken_lw __ = nnu8v2otmx2ykow+jrn1lqryphlmpszqa8rs1krqp1ppxwmqo8gg77errzbhfzf38p05culhak3qatilxefj6potx1wxfpffpffpffpfpfpfpfpfpfpfpfpfppfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfpfppxwmspxwmQo8gg77erzbhfzfzf38p05culhak3 4%40F0NKYBBQCTD4G9YL1J8KDNCWDQRPIXREOHLUMP2LC*= P%2FFJD5CDLO0PCGU6GNTAPW*= p6qaytldvurkqn84c9vdvg*
はい、私のクッキーは暗号化されています。 cookienameは「4%40f0f0nkybbqctd4g9yl1j8kdncwdqrpixreohlump2lc*」です。 "リダイレクトはそこに新しい空のクッキーを追加しているようです。なぜ?わからない。
追加デバッグ後、実際にリクエストには3つのCookieがあることがわかりました。 1つ目は空のCookieで、名前を使用するときにデフォルトで返されます。コレクションの3番目のCookieには、値が設定されています。このクッキーをリクエストに追加している理由は謎です。私はおそらく、他のものよりも値を持つCookieを選ぶことでこれを回避することができますが、それが何であれ、signinページでのみ起こっているルートの問題を修正したいです。
解決
何が起こっているのか、リダイレクトアクションはリクエストの処理を終了し、Cookieの設定を許可しないRespons.redirect()を実行していることだと思います。セッションのためにここで文書化されているものと同様の問題のように聞こえます:
http://weblogs.asp.net/bleroy/archive/2004/08/03/207486.aspx
他のヒント
RedirectToAction()を呼び出した後、適切に設定されていないCookieがありました。この答えで説明されているように、私はtempdata []を利用することになりました。 https://stackoverflow.com/a/3624353/1265197
これが私のコードです。アカウント文字列は、「アカウント」という名前のURL上のクエリ文字列を介して取得されました。
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();
}