2012-10-18 48 views
4

我發現了一篇MSDN文章,這篇文章可能是我在sequence and workings of the IIS integrated pipeline上看到的最有幫助的文章。但是它提出了關於認證的有趣問題。澄清ASP.NET生命週期事件序列

表單認證在流水線的早期顯示爲「正在執行」。 「執行」處理程序(如ASP.NET MVC路由和控制器執行)將在稍後顯示。但很多時候對於ASP.NET MVC認證故事是這樣的:

public ViewResult Login(LoginModel login) 
{ 
    if (ModelState.IsValid) 
    { 
     if (Membership.ValidateUser(...)){ 
      FormsAuthentication.SetAuthCookie(...); 
     } 
    } 
    //... 
} 

上面的代碼表明,在「執行」處理階段發生(形式)的認證,而不是更早的「身份驗證」 IIS階段。

有人可以澄清這種看似離差嗎?

我個人對此的猜測是,IIS的「身份驗證」階段將執行FormsAuthenticate.Authorize(...),如果沒有成員資格提供商已經配置我指出,如果指示。但是,如果我配置自己的成員資格提供程序,那麼IIS「身份驗證」階段無效 - 並等待「執行」階段,以便我自己的身份驗證代碼可以執行。

如果我的猜測是正確的,那麼如果我配置了自己的成員資格提供程序,這意味着「獲取狀態」IIS階段也不會按預期運行:它將不會「建立」會話,因爲會話獲勝直到我在我的MVC控制器中完成認證步驟後才能建立。或者,也許「身份驗證」和「獲取狀態」相關的應用程序事件將「hold-off」,不會被提出,直到我的控制器執行了它的驗證代碼?

是嗎?沒有?

回答

1

這裏發生了兩件不同的事情,這是可以理解的混淆。

  1. 正如您所瞭解的,Forms Authentication模塊的運行很早。但是該模塊主要關注表單auth cookie並建立其真實性,如果它是可信的,那麼爲ASP.NET設置正確的身份主體以供使用。
  2. 您通常在MVC項目中看到的身份驗證代碼是關於將用戶登錄進來的,如果憑據正確,它將爲表單身份驗證設置cookie以供日後處理。