2009-10-30 56 views
0

一些背景開始:Asp.net MVC會員設計

我已經實現了自定義的MembershipProvider,從我所謂的「WebMemberShipProvider」

目前我已經叫服務「的服務層驗證用戶MembershipService「,該服務在服務層上實現接口IMembershipService。 這MemberShipService查詢DAL和驗證基於用戶名/密碼

用戶我也創建了一個定製AuthorizeAttribute名爲「AuthorizeOwnerAttribute」而這正是我在設計問題。

對於每個控制器,我都依賴於服務。例如。 UsersController在它的構造函數中接受一個I​​UserService。

如何在當前登錄用戶和正在編輯的用戶具有相同「StudioId」的ActionResult上調用AuthorizeAttribute。注:我想用AuthorizeAttribute多個控制器,而不僅僅是「UserController的」

所以我的問題給你:

  1. 我應該怎麼做來存儲 當前認證用戶的 「StudioId」,如這將在多個控制器上使用 。
  2. 我應該如何將認證傳遞給服務層,因爲我想驗證請求在服務和數據訪問層中是有效的,而不僅僅是在客戶端。 (如果這是可取的,我只是假設客戶機上驗證僅是不夠的,如果我想在一個獨立的應用程序以後再次使用BLL和DAL)使用

技術: - LINQ到通過 庫模式 SQL - ASP.NET MVC預覽2

任何建議或代碼示例將非常歡迎。

+0

只是一些澄清...你是否實施System.Web.Security.MembershipProvider? – zowens 2009-10-30 16:55:08

+0

是的,System.Web.Security.MembershipProvider – 2009-10-30 18:24:53

回答

1

我基本上做了我的安全主要是在控制器級別這樣的事情。我做出了一個決定,不把事情放在鏈條的下面,以便確定一個人是否可以訪問它,或者如果我確實要確保IPrincipal.IsInRole()足以滿足它。

現在我做了一些其他的感覺有點hackier。我需要確保那些已經註冊並且分配給他們的人是唯一能夠從本節訪問它的人。

所以我創建了一個屬性過濾器的工作原理大致是這樣的:

public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      var thingToView = filterContext.ActionParameters[_thingToView] as thingToView ; 
      var registration = filterContext.ActionParameters[_registration] as Registration; 


      if (!registration.CanSeeThing(thingToView)) 
      { 
       throw new RegistrationCannotViewThing(registration, thingToView); 
      } 

      base.OnActionExecuting(filterContext); 
     } 

現在,在這個實現覺得有點哈克的事情是,我這樣做對我的控制器的方法:

[AuthFilter(ThingToView ="thingToView", Registration="registration") 
public ActionResult Method(Thing thingToView, Registration registration) 
{ 
.... 
} 

實際參數分配發生在模型聯編程序中。安全性通過檢查傳遞給方法的參數的過濾器發生。然後,我在很多地方重用了這個過濾器。

爲了傳遞用戶正在調用的方法,我在模擬活頁夾上做了一件類似於Scott Hanselman的帖子:http://www.hanselman.com/blog/IPrincipalUserModelBinderInASPNETMVCForEasierTesting.aspx

我想你可以使用上面的示例博客帖子來獲取你的用戶對象到你的控制器方法,以便將它傳遞給你的服務層。

+0

必須有一個更清潔的SOC方式來做到這一點? 這對我來說是最後一招。感謝您的輸入。 – 2009-10-30 19:09:05

+0

好吧,重讀您的帖子後,您可以將工作室ID存儲在自定義應用程序主體中。有很多教程可以找到,以便在asp.net應用程序中設置IPrincipal。 如果您想要傳遞驗證,您可以手動將IPrincipal傳遞到服務層,或使用一些AOP技術。我確實試圖堅持使用MVC中提供的內容。 AOP在.Net中沒有廣泛使用(或者至少我不這麼認爲)。 – Min 2009-10-30 19:54:50