2011-01-27 44 views
4

我有一個asp.net mvc項目,持久性由存儲庫處理。使用表單身份驗證。現在我需要實施授權。例如,我需要確保經理用戶只能開啓他/她的任務,並指派工人來完成任務。工人只會看到已分配給他/她的任務。超級版主可以編輯所有內容。 有沒有準備好使用的框架,允許我定義權限?查找在ASP.NET MVC項目上使用的授權框架

我在評估Ayende犀牛安全的過程。我在哪裏可以獲得更多示例代碼?您對Rhino Security有什麼看法?
我的項目使用Linq到SQL,並沒有使用NHibernate。犀牛安全可以在沒有NHibernate的情況下運行

回答

5

恐怕犀牛的安全性取決於NHibernate的工作。
我一直在評估犀牛安全幾個月,最後,我決定使用它,因爲它是一個非常非常好的產品。
你可以在Ayende的bloghere找到有用的信息。 我已經分散了一點,把它與StructureMap(而不是Castle Windsor)整合在一起。你可以找到一些信息here
要做你想達到的目標,你必須定義一個實現IEntityInformationExtractor接口的類。

所有你需要添加下列引用(我已經重新編譯犀牛安全與NH 3.0),以首先:

  • Microsoft.Practices.ServiceLocation
  • NHibernate的
  • NHibernate.ByteCode.Castle
  • StructureMap
  • Rhino.Security
  • StructureMapAdapter

然後定義一個引導程序:

public static class Bootstrapper 
{ 
    public static void Initialize() 
    { 
     ObjectFactory.Initialize(cfg => 
     { 
      cfg.UseDefaultStructureMapConfigFile = false; 
      cfg.IgnoreStructureMapConfig = true; 
      cfg.AddRegistry<StructureMapRegistry>(); 
     }); 
     ServiceLocator.SetLocatorProvider(() => new StructureMapServiceLocator(ObjectFactory.Container)); 
    } 
} 

然後你定義StructureMap註冊表類:

public class StructureMapRegistry : Registry 
{ 
    public StructureMapRegistry() 
    { 
     string ConnDb = "Data Source=(local); Initial Catalog=RhinoSecurity_Test; Trusted_Connection=true;"; 

     For<ISessionFactory>() 
      .Singleton() 
      .TheDefault.Is.ConstructedBy(() => new NHSessionFactory(ConnDb, false).SessionFactory); 
     For<ISession>() 
      .Singleton() 
      .TheDefault.Is.ConstructedBy(x => x.GetInstance<ISessionFactory>().OpenSession()); 
     For<IAuthorizationRepository>() 
      .Use<AuthorizationRepository>(); 
     For<IPermissionsService>() 
      .Use<PermissionsService>(); 
     For<IAuthorizationService>() 
      .Use<AuthorizationService>(); 
     For<IPermissionsBuilderService>() 
      .Use<PermissionsBuilderService>(); 
     For<IEntityInformationExtractor<Model.Task>>() 
      .Use(p => 
       { 
       return (new TaskInfromationExtractor(p.GetInstance<ISession>())); 
       }); 
    } 
} 

NHSessionFactory基本上創建一個會話NH工廠。

我創建了一個實現IEntityInformationExtractor的類(TaskInfromationExtractor)。這將允許您爲任務實體定義權限。 現在您的應用已準備就緒。你只需要「引導」結構圖:

  • Bootstrapper.Initialize();

當你的應用程序啓動時你會做到這一點。 現在你可以使用Rhino安全信息庫和服務來創建用戶,組,關係等等,因爲我給你建議的鏈接。 你可以找到一個我準備好的樣本here

+0

非常感謝鏈接。任何示例代碼將非常受歡迎。我的項目使用Ninject,但是Rhino Security自述文件說:「Rhino Security使用Common Service Locator(http://www.codeplex.com/CommonServiceLocator)」。這會是一個問題嗎?預先感謝您提供的任何資源。 – 2011-01-28 20:44:14

+0

是的,這就是爲什麼我切換到StructureMap的原因,不是唯一的......我必須說我對S.M.更加開心。現在。 – LeftyX 2011-01-29 19:18:44

1

我認爲asp.net mvc attributes對於這樣的任務會很好。

首先,您需要創建一些角色列表,並以某種方式引用用戶。 登錄後,您需要在Session中存儲用戶角色。 比標記控制器或具有此屬性的操作。 在屬性中,您應該傳遞需要執行某些操作的角色。 在屬性實現中,您只需檢查用戶是否有某個角色,然後無所事事,否則重定向到未經授權的頁面。或者拋出一些自定義異常並在global.asax中重定向。

Mb check this article for code example。