私は 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 を選択することで、この問題を回避できますが、それが何であれ、サインイン ページでのみ発生している根本的な問題を修正したいと考えています。