2010-11-11 14 views
2

J'utilise un cookie et si le cookie est défini, il l'envoie à l'utilisateur, sinon il lui montre une page d'erreur (non autorisé). Le cookie est correctement défini et si je navigue sur une page en la tapant dans la barre d'adresse, cela fonctionne très bien. Cependant, lorsque j'utilise RedirectToAction ou FormsAuthentication.RedirectToLogin, le cookie n'est pas disponible, ce qui provoque une boucle infinie dans la redirection.RedirectToAction provoquant que le cookie vide soit placé avant le cookie avec des valeurs, ce qui entraîne un cookie "perdu"

Page d'accueil - Si l'utilisateur a un cookie, allez sur le site, sinon affichez la page d'accueil.

Signin - Si l'utilisateur a cookies, page show, d'autre rediriger vers la maison

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

Mon action Accueil ressemble à ceci

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 à ce

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

     return View(model); 
    } 

Maintenant, quand je frappe mysite.com/ la redirection provoque une boucle infinie. En débogage, l'attribut ne trouve pas la valeur du cookie. Le cookie est en fait vide dans la requête. Quand je tape mysite.com/signin tout fonctionne Peachy. Des idées?

EDIT

Comme suggéré, je courais 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és. Le cookiename est "4% 40f0nkyBbqcTD4g9yl1J8KDNcWdqRpixrEoHLuMP2Lc *" Il me semble que la redirection est en train d'ajouter un nouveau cookie vide. POURQUOI? Je ne suis pas sûr.

ADDITIONNEL Après le débogage, j'ai trouvé qu'il y avait 3 cookies dans la demande. Le premier est le cookie vide, qui est retourné par défaut lors de l'utilisation du nom. Le troisième cookie de la collection a les valeurs définies.Pourquoi il ajoute ce cookie dans la requête est un mystère. Je peux probablement contourner ce problème en sélectionnant le cookie qui a une valeur par rapport à l'autre, mais je préfère résoudre le problème racine, quel qu'il soit, qui se produit uniquement sur la page de connexion.

+0

Parce qu'il fait! Pouvez-vous utiliser Server.Transfer? – Aliostad

+0

Y a-t-il une raison d'utiliser un cookie pour cela? Il y a une solution parfaitement fonctionnelle que vous devriez utiliser à la place. http://www.asp.net/mvc/tutorials/authenticating-users-with-forms-authentication-cs – rboarman

+0

non, et maintenant, tout à coup, sans aucun changement au code de cookie, mon cookie ne se règle plus , période. C'est frustrant. – Josh

Répondre