7

我正在學習MVC4,並且我正在遵循Pro ASP NET MVC4第4版書籍來創建體育商店項目。MVC 4表單身份驗證不與[授權]一起使用

我一直在webforms中開發,我想弄清楚表單身份驗證如何在MVC4中工作。

這是我所取得的成就:

的Web.Config

<authentication mode="Forms"> 
<forms loginUrl="~/Account/Login" timeout="2880"/> </authentication> 

的AccountController登錄操作:

[HttpPost] 
     public ActionResult Login(LoginViewModel model, string returnUrl) 
     { 
      if (ModelState.IsValid) 
      { 
       if (authProvider.Authenticate(model.UserName, model.Password)) 
       { 
        return Redirect(returnUrl ?? Url.Action("Index", "Admin")); 
       } 
       else 
       { 
        ModelState.AddModelError("", "Incorrect username or password"); 
        return View(); 
       } 
      } 
      else 
      { 
       return View(); 
      } 
     } 

驗證提供者:

public bool Authenticate(string username, string password) { 
      bool result = FormsAuthentication.Authenticate(username, password); 
      if (result) 
      { 
       FormsAuthentication.SetAuthCookie(username, false); 
      } 

      return result; 

     } 

我設置了AuthCookie,現在我想知道,如何保護其他控制器 和行動出的AccountController

的應用有一個叫做AdminController控制器,在這裏你可以編輯的產品和以下{控制器/動作}下
產品列表中

管理員/指標

所以,如果我不missunderstanding理論,如果用戶沒有在的AccountController登錄他們不應該能夠調用與[授權]在聲明標記 操作:

public class AdminController : Controller 
    { 
     private IProductRepository repository; 


     public AdminController(IProductRepository repo) 
     { 
      repository = repo; 
     } 

     [Authorize] 
     public ActionResult Index() 
     { 

      return View(repository.Products); 
     } 
    } 

事情是我可以調用管理控制器的索引操作,沒有任何問題,也沒有引入登錄。

我需要一些指導來了解它是如何工作的。我已經做了一些研究,找不到任何東西,而且這本書沒有涉及這個話題。

在此先感謝。

編輯:我關閉了Chrome瀏覽器,並沒有改變任何工作。我正在使用標籤,我猜這個cookie甚至停止並開始調試。

+0

您使用的是哪種Visual Studio版本? 2010年還是2012年? –

回答

9

如果一個控制器動作與[Authorize]屬性來修飾(如您的Admin/Index動作),如果你沒有在請求一個有效的窗體身份驗證cookie,你不能調用這個動作。

同樣在您的Login操作中,驗證成功後,您不應該返回一個視圖,但應該重定向,以便cookie在後續請求中正確設置並可用。

下面是未經身份驗證的用戶嘗試訪問受保護的Admin/Index操作時應該發生的情況。[Authorize]屬性將拋出401異常,正如您從傳統WebForms中所瞭解的將被表單身份驗證模塊攔截,並且您將被重定向到您的web.config中配置的loginUrl,從而將最初請求的受保護資源的ReturnUrl查詢字符串參數。

因此,您必須在帳戶控制器上有一個Login操作,該操作未用[HttpPost]屬性修飾,並且應該爲包含登錄視圖的視圖提供服務。請求將如下所示:

/Account/Login?ReturnUrl=%2Fadmin%2Findex 
+4

廢話,我關閉了我的瀏覽器並清理了緩存,現在它工作時沒有更改任何東西 –

+1

是的,也許你有一些表單認證cookie從以前的會話中遺留下來。 –

+1

你是唯一一個幫助和解釋得非常好的人。如此接受的答案。非常感謝 –

相關問題