RedirectToActionの原因で空のCookieを値でCookieより先に設定し、「Lost」Cookieになります

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

質問

私は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();
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top