2012-02-21 154 views
1

我在ASP.net MVC 3應用中的以下繼承層次:ASP.Net MVC 3控制器的繼承

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

我發現了AuthenticatedBaseController的構造函數是射擊兩次,當我做一個GET請求回家。有人可以告訴我我做錯了什麼嗎?

+0

好的起點是使用Fiddler來排除瀏覽器實際上並未發出兩個GET請求。 – 2012-02-21 22:34:01

+0

您應該使用'Authorize'授權過濾器。 – bevacqua 2012-02-21 22:38:48

+0

這是一種非常不安全的身份驗證方式。劫持會話cookie要比授權cookie容易得多。您應該使用AuthorizeAttribute,並使用FormsAuthentication類來生成身份驗證票據。或者,實施您自己的基於IIdentity的服務並使用它。 – 2012-02-21 22:43:02

回答

1

要回答您的問題,它會發射兩次,因爲您將用戶重定向到另一個操作,這會導致另一個請求,從而導致創建另一個控制器實例。

+0

重定向點不會繼承AuthenticatedBaseController的控制器。 – klork 2012-02-21 23:16:47

+1

@klork - 經過進一步分析,您的代碼甚至無法工作。 RedirectToAction不是一個命令。您必須從操作方法中將重定向返回到操作。你不能只是叫它,它什麼都不會做。 – 2012-02-21 23:54:04

+0

是的,這是問題。謝謝 – klork 2012-02-22 04:51:16