2012-02-21 4 views
1

J'ai la hiérarchie d'héritage suivant dans mon ASP.net MVC 3 app:ASP.Net MVC 3 Contrôleur Inheritence

public class HomeController : AuthenticatedBaseController 
{ 

    public ActionResult Index() 
    { 
     return View(); 
    } 
} 


public class AuthenticatedBaseController : BaseController 
{ 
    public AuthenticatedBaseController() 
    { 
     if (!this.UserToken.IsAuthenticated) 
     { 
      RedirectToAction("Login", "Login"); 
     } 
    } 

} 

public class BaseController : Controller 
{ 

    private Token _token; 
    public Token UserToken 
    { 
     get 
     { 
      _token = (Token)(Session["token"]); 
      if (_token == null) 
      { 
       SetToken(); 
      } 
      return _token; 
     } 
    } 

    public void SetToken() 
    { 
     _token = new Token(Session.SessionID, Request.Url.Host, Request.Url.ToString()); 
     Session["token"] = _token; 
    } 
} 

Je trouve que le constructeur de la AuthenticatedBaseController tire deux fois quand je fais une requête GET à la maison. Quelqu'un peut-il m'aider à me dire ce que je fais de mal?

+0

Un bon point de départ est d'utiliser Fiddler pour exclure que le navigateur n'envoie pas deux requêtes GET. –

+0

Vous devez utiliser les filtres d'autorisation 'Authorize'. – bevacqua

+0

Il s'agit d'un moyen très peu sûr de procéder à l'authentification. Il est beaucoup plus facile de détourner un cookie de session qu'un cookie d'autorisation. Vous devez utiliser AuthorizeAttribute et utiliser la classe FormsAuthentication pour générer des tickets d'authentification. Ou, implémentez votre propre service basé sur IIdentity et utilisez-le. –

Répondre

1

Pour répondre à votre question, il se déclenche deux fois car vous redirigez l'utilisateur vers une autre action, ce qui provoque une autre requête, ce qui entraîne la création d'une autre instance de contrôleur.

+0

Le contrôleur auquel les points de redirection n'héritent pas du AuthenticatedBaseController. – klork

+1

@klork - après une analyse plus poussée, votre code ne peut même pas fonctionner. RedirectToAction n'est pas une commande. Vous devez RETOURNER une redirection à l'action à partir d'une méthode d'action. Vous ne pouvez pas simplement l'appeler, cela ne fera rien. –

+0

oui, c'était le problème. Merci – klork