ASP.NET 混合形式/Windows 身份驗證
我目前正在開發一個 MVC3 Web 應用程序,該應用程序需要要求外網使用者登錄並使用表單身份驗證進行身份驗證。Intranet 使用者應使用 Windows 身份驗證自動登錄。
我找到了這篇文章, http://aspalliance.com/553_Mixed_Mode_Authentication.all 但它的日期是 2004 年 11 月,我想找到比 7 年前更近的東西。
我的計劃是在 IIS 中有兩個應用程序,虛擬目錄指向同一個物理目錄,但一個允許匿名訪問,另一個不允許。
當使用者在 Windows/Intranet 方面進行身份驗證時,我希望簡單地模擬使用者通過表單身份驗證登錄。這種方法有什麼陷阱嗎?有更好的想法嗎?
編輯:2011 年 7 月 22 日
我正在使用 IIS7,它不允許我做舊文章中建議的許多事情。由於身份驗證在 IIS7 和 ASP.NET 網站之間集成得更緊密,因此不允許某些事情。例如,當應用程序的其餘部分使用 Forms Auth 時,我無法在單個文件上設置 Windows Auth。
想知道這裡最好的方法是不是有兩個應用程序,其中第一個應用程序使用 Windows 身份驗證,並且僅包含 HTTP 管道中 PostAuthenticate 事件的掛鉤。如果使用者通過了身份驗證,則給他們一張表單票證並重定向到使用表單身份驗證的目標應用 App2。您必須注意 cookie 不是特定於路徑的,並且兩個應用程序駐留在同一伺服器上(或者加密密鑰在 web.config 中同步)。如果使用者未通過身份驗證,您只需在沒有身份驗證票的情況下重定向他們,然後他們在到達 App2 時登錄。
應用程序1:www.myUrl.com\MyApp
這是應用程序的“公共”網址,並通過掛鉤 PostAuthenticate 事件來檢測網路使用者(請參閱Professional ASP.NET 2.0 Security, Membership, and Role Management):
//Hook PostAuthenticateRequest inside of global.asax void Application_PostAuthenticateRequest(Object sender, EventArgs e) { IPrincipal p = HttpContext.Current.User; if (p.Identity.IsAuthenticated) { // to do: give them a non-path specific ticket and redirect to App2 } }應用程序2:www.myUrl.com\MyApp2
這是實際應用。當網路使用者從 App1 到達時,他們已經有一張表單票。當非網路使用者到達時,他們將被重定向到 login.aspx。
注意: 這樣做的一個缺點是網路使用者將 App2 加入書籤。我不太確定如何解決這個問題。如果他們有一個不會過期的 cookie,那也沒關係。一種選擇是在登錄頁面上放置一個連結,上面寫著“我已經是網路使用者 - 自動登錄”,這將連結回 App1,他們將在哪裡登錄?
我有一些程式碼可以幫助簽發表格票。我有時間會更新答案。
請注意,您將不得不在 App2 中做一些花哨的角色管理步驟來處理不同的角色提供者。上面提到的亞馬遜參考是舊的,但是當我遇到這些自定義身份驗證和授權問題時,我發現自己不斷地參考它。