2010-05-26 52 views
4

FHI,asp.net MVC和門戶一樣的功能

我需要類似功能的一些門戶網站,在請求中PARAM將indentify門戶網站建立一個網站。像這樣http:/域/控制器/行動/門戶

現在我的問題是,如果一個門戶網站不存在必須重定向到其他網站/頁面和用戶可以登錄到一個門戶網站,但如果用戶來到其他門戶網站時,用戶必須重定向到該門戶網站的登錄頁面。

我現在有一些工作,但我覺得在管道中必須有一箇中心位置來處理這個問題。我當前的解決方案使用自定義操作篩選器來檢查門戶參數,並查看門戶是否存在,並檢查用戶是否登錄該門戶(用戶登錄的門戶位於身份驗證cookie中)。我在application_postauthentication事件中創建自己的IIndentiy和IPrincipal。

我有2個問題,我目前的做法:

1:這不是真正的執行,我必須將屬性添加到所有控制器和/或行動。

2:對用戶進行身份驗證並不真正有效,我希望能夠正常工作。但爲此,當我創建我的IPrincipal/IIndenty時,我需要訪問路線的參數,我似乎無法找到正確的位置來執行此操作。

希望有人能給我一些指點, 理查德。

回答

0

您可以通過控制器中的屬性強制執行用戶授權。您可以將其應用於每個操作(包括get和post)。我認爲爲控制器中的每個動作添加一些驗證來編寫安全代碼是合理的,如果我在這裏出錯,請糾正我的錯誤。

+0

它的一個選項,這就是我現在正在做的。但我認爲它不是正確的方法,因爲它實際上是一個應用程序範圍廣泛的事物,而不是控制器級別的。換句話說,我認爲應用程序必須執行規則,如果門戶不存在重定向,甚至不打算嘗試去某個控制器。它應該更像是路由不存在,並且沒有去哪裏但重定向。對於用戶身份也是如此,如果他要去一個他沒有登錄的門戶,它不應該被授權給漏洞應用程序。 – Richard 2010-05-26 12:40:08

1

有幾種不同的方式可以做到這一點(一如既往...)。如果你想在控制器(或通過屬性)中執行它,但你也想在全局執行它,那麼你總是可以使用一個自定義的基本控制器類並在那裏應用邏輯。 actionfilterattribute是繼承人,bob是你的叔叔。

另一方面,這真的感覺就像我的路由問題。所以我可能會考慮創建一個自定義路線來處理你在做什麼。如果你這樣做,那麼一旦你得到它的工作,你會想要在負載下測試它,以確保你有一個好的緩存策略(以便每個請求不是一個數據庫查找的路線+另一個無論在控制器中發生什麼)。

0

對於缺少門戶重定向,我會處理這個路由。如果您的門戶數量相對較少,則可以通過爲每個控制器創建唯一路由,然後爲重定向設置默認路由來完成此操作。路由按照您創建的順序進行評估,因此只需將默認路由放在底部。您的路線註冊會是這個樣子:

routes.MapRoute(
     "Portal1", 
     "{controller}/{action}/FirstPortal", 
     new {controller = "defaultController", action = "defaultAction", 
      portal = "FirstPortal"} 
    ); 

routes.MapRoute(
     "Portal2", 
     "{controller}/{action}/SecondPortal", 
     new {controller = "defaultController", action = "defaultAction", 
      portal = "SecondPortal"} 
    ); 

routes.MapRoute(
     "Default", 
     "{controller}/{action}", 
     new {controller = "defaultController", action = "defaultAction", 
      portal = "Default"} 
    ); 

這樣,您就可以使用「門戶」路線值來選擇門戶網站,以及不符合將被路由到指定的控制器/行動的任何請求您默認路由,它可以負責適當地重定向用戶。