RedirectToAction faisant biscuits vide à mettre en avant cookie avec des valeurs, qui se traduit par « perdu » cookie

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

Question

J'utilise un cookie et si le cookie est défini, il transmet à l'utilisateur de signin, sinon il leur montre une page d'erreur (non autorisée). Le cookie est réglé correctement, et si je navigue sur une page en tapant dans la barre d'adresse, il fonctionne très bien. Cependant, quand je l'utilise RedirectToAction ou FormsAuthentication.RedirectToLogin le cookie ne sont pas disponibles, ce qui provoque une boucle infinie dans la redirection.

Accueil -. Si l'utilisateur a des cookies, allez signin, si pas montrer la page d'accueil

Signin - Si l'utilisateur a cookies, page show, sinon redirect à l'accueil

Ma redirection est gérée par un attribut.

public sealed class RequireBillerAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        IUserSession session = ServiceLocator.Locate<IUserSession>();

        if (session.BillerId == 0)
            filterContext.Result = new RedirectResult("~/");
    }
}

regards d'action My Home comme celui-ci

    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();
    }

Et mon action Signin ressemble à ceci

    [RequireBiller]
    public ActionResult Index()
    {
        SignInModel model = BuildSignInModel();

        return View(model);
    }

Maintenant, quand je mysite.com/ frappé la redirection provoque une boucle infinie. Dans le débogage, l'attribut ne peut pas trouver la valeur du cookie. Le cookie est en fait blanc dans la demande. Quand je tape tout ce mysite.com/signin fonctionne Peachy. Toutes les idées?

EDIT

Comme suggéré, j'ai couru Fiddler. Voici ce que les demandes ressemblent

#   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 

Et voici les informations du cookie

Première

  

__ __ = RequestVerificationToken_Lw NNu8v2oTMX2YKQOW + JRN1LQRYPhlmPszQa8Rs1KrQp1pPxWmQO8GG7eRrzbhFZF38p05ckuLHAK3QaTIlxeFJ6POTX1woXRx / ahApLpF529inJO9mj3jSnoHqG6fthzJpoLYQL61NOCCUO2wwzLmQg ==;   4% 40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc * = P% 2ffJD5CdLO0pCGU6GntaPw * = P6QAytlDVUrkQn84c9vDVg *

Deuxième

  

4% 40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc * =;   __RequestVerificationToken_Lw __ = NNu8v2oTMX2YKQOW + JRN1LQRYPhlmPszQa8Rs1KrQp1pPxWmQO8GG7eRrzbhFZF38p05ckuLHAK3QaTIlxeFJ6POTX1woXRx / ahApLpF529inJO9mj3jSnoHqG6fthzJpoLYQL61NOCCUO2wwzLmQg ==;   4% 40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc * = P% 2ffJD5CdLO0pCGU6GntaPw * = P6QAytlDVUrkQn84c9vDVg *

Troisième

  

__ __ = RequestVerificationToken_Lw NNu8v2oTMX2YKQOW + JRN1LQRYPhlmPszQa8Rs1KrQp1pPxWmQO8GG7eRrzbhFZF38p05ckuLHAK3QaTIlxeFJ6POTX1woXRx / ahApLpF529inJO9mj3jSnoHqG6fthzJpoLYQL61NOCCUO2wwzLmQg ==;   4% 40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc * = P% 2ffJD5CdLO0pCGU6GntaPw * = P6QAytlDVUrkQn84c9vDVg *

Quatrième

  

4% 40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc * =;   __RequestVerificationToken_Lw __ = NNu8v2oTMX2YKQOW + JRN1LQRYPhlmPszQa8Rs1KrQp1pPxWmQO8GG7eRrzbhFZF38p05ckuLHAK3QaTIlxeFJ6POTX1woXRx / ahApLpF529inJO9mj3jSnoHqG6fthzJpoLYQL61NOCCUO2wwzLmQg ==;   4% 40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc * = P% 2ffJD5CdLO0pCGU6GntaPw * = P6QAytlDVUrkQn84c9vDVg *

Et voici à quoi il ressemble quand je tape / signin dans la barre d'adresse

  

__ __ = RequestVerificationToken_Lw NNu8v2oTMX2YKQOW + JRN1LQRYPhlmPszQa8Rs1KrQp1pPxWmQO8GG7eRrzbhFZF38p05ckuLHAK3QaTIlxeFJ6POTX1woXRx / ahApLpF529inJO9mj3jSnoHqG6fthzJpoLYQL61NOCCUO2wwzLmQg ==;   4% 40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc * = P% 2ffJD5CdLO0pCGU6GntaPw * = P6QAytlDVUrkQn84c9vDVg *

Oui, mes cookies sont cryptées. Le cookiename est « 4% 40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc * » Il me semble que la redirection est l'ajout d'un nouveau cookie vide là-dedans. POURQUOI? Je ne sais pas.

COMPLEMENTAIRES Après le débogage, j'ai trouvé qu'en effet il y a 3 cookies dans la demande. Le premier est le cookie vide, qui est retourné par défaut lorsque vous utilisez le nom. Le troisième cookie de la collection a les valeurs paramétrées. Pourquoi est-il ce cookie dans l'ajout de la demande est un mystère. Je peux probablement contourner ce en choisissant le cookie qui a une valeur sur l'autre, mais je préfère résoudre le problème de la racine, quoi que ce soit, ce qui se passe uniquement sur la page signin.

Était-ce utile?

La solution

Je pense que ce qui se passe est que RedirectToAction fait un Response.Redirect () qui met fin à la traitement de la demande et ne permet pas le cookie d'être ensemble. Sons comme un problème similaire à ce qui est documenté ici pour la session:

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

Autres conseils

J'ai eu un cookie qui n'a pas été correctement définis après avoir appelé RedirectToAction (). J'ai fini par utiliser TempData [] comme décrit dans cette réponse: https://stackoverflow.com/a/3624353/1265197

Voici mon code. La chaîne de compte a été récupéré par l'intermédiaire d'une chaîne de requête sur l'URL du nom « compte »:

public ActionResult OriginatingAction(string account)
{
    //Some other code
    TempData["data"] = account; 

    return RedirectToAction("RedirectAction");
}

Je pourrais alors utiliser TempData [ « données »] pour définir le cookie dans l'action que je réorienté à:

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();
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top