2

私は 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 

そして、ここにクッキー情報があります

初め

__RequestVerificationToken_Lw__=NNu8v2oTMX2YKQOW+JRN1LQRYPhlmPszQa8Rs1KrQp1pPxWmQO8GG7eRrzbhFZF38p05ckuLHAK3QaTIlxeFJ6POTX1woXRx/ahApLpF529inJO9mj3jSnoHqG6fthzJpoLCUQLQL6=fthzJpoLCULQL61; 4%40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc*=P%2ffJD5CdLO0pCGU6GntaPw* =P6QAytlDVUrkQn84c9vDVg *

2番

4%40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc*=; __RequestVerificationToken_Lw__=NNu8v2oTMX2YKQOW+JRN1LQRYPhlmPszQa8Rs1KrQp1pPxWmQO8GG7eRrzbhFZF38p05ckuLHAK3QaTIlxeFJ6POTX1woXRx/ahApLpF529inJO9mj3jSnoHqG6fthzJpoLCUQLQL6=fthzJpoLCULQL61; 4%40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc*=P%2ffJD5CdLO0pCGU6GntaPw* =P6QAytlDVUrkQn84c9vDVg *

三番

__RequestVerificationToken_Lw__=NNu8v2oTMX2YKQOW+JRN1LQRYPhlmPszQa8Rs1KrQp1pPxWmQO8GG7eRrzbhFZF38p05ckuLHAK3QaTIlxeFJ6POTX1woXRx/ahApLpF529inJO9mj3jSnoHqG6fthzJpoLCUQLQL6=fthzJpoLCULQL61; 4%40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc*=P%2ffJD5CdLO0pCGU6GntaPw* =P6QAytlDVUrkQn84c9vDVg *

第4

4%40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc*=; __RequestVerificationToken_Lw__=NNu8v2oTMX2YKQOW+JRN1LQRYPhlmPszQa8Rs1KrQp1pPxWmQO8GG7eRrzbhFZF38p05ckuLHAK3QaTIlxeFJ6POTX1woXRx/ahApLpF529inJO9mj3jSnoHqG6fthzJpoLCUQLQL6=fthzJpoLCULQL61; 4%40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc*=P%2ffJD5CdLO0pCGU6GntaPw* =P6QAytlDVUrkQn84c9vDVg *

アドレス バーに /signin と入力すると、次のように表示されます。

__RequestVerificationToken_Lw__=NNu8v2oTMX2YKQOW+JRN1LQRYPhlmPszQa8Rs1KrQp1pPxWmQO8GG7eRrzbhFZF38p05ckuLHAK3QaTIlxeFJ6POTX1woXRx/ahApLpF529inJO9mj3jSnoHqG6fthzJpoLCUQLQL6=fthzJpoLCULQL61; 4%40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc*=P%2ffJD5CdLO0pCGU6GntaPw* =P6QAytlDVUrkQn84c9vDVg *

はい、私の Cookie は暗号化されています。cookiename は「4%40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc*」です。リダイレクトによって新しい空の Cookie がそこに追加されているようです。なぜ?わからない。

追加 デバッグ後、リクエストに実際に 3 つの Cookie があることがわかりました。1 つ目は空の Cookie で、名前を使用するとデフォルトで返されます。コレクションの 3 番目の Cookie には値が設定されています。この Cookie をリクエストに追加する理由は謎です。おそらく、他の Cookie よりも価値のある Cookie を選択することで、この問題を回避できますが、それが何であれ、サインイン ページでのみ発生している根本的な問題を修正したいと考えています。

4

2 に答える 2

3

RedirectToAction が Response.Redirect() を実行していて、リクエストの処理を終了し、Cookie の設定を許可していないことが原因だと思います。セッションについてここに文書化されているものと同様の問題のように聞こえます:

http://weblogs.asp.net/bleroy/archive/2004/08/03/207486.aspx

于 2011-03-28T07:12:21.180 に答える
0

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();
}
于 2019-06-19T16:35:14.940 に答える