查找要在ASP.NET MVC项目上使用的授权框架

dan*_*n_l 4 authorization rhino-security asp.net-mvc-2

我有一个asp.net mvc项目,持久性由存储库处理.使用表单身份验证.现在我需要实施授权.例如,我需要确保经理用户只能打开他/她的任务并将工作人员分配到任务中.工人只能看到分配给他/她的任务.超级版主可以编辑所有内容.是否有任何可以使用的框架允许我定义权限?

我正在评估Ayende Rhino Security.我在哪里可以获得更多示例代码?您对Rhino Security有何看法?
我的项目使用Linq to SQL并且没有使用NHibernate.Rhino Security可以在没有NHibernate的情况下工作吗?

Lef*_*tyX 5

我担心,Rhino Security依赖Nhibernate来工作.
我一直在评估Rhino Security几个月,最后,我决定使用它,因为它是一个非常好的产品.
您可以在Ayende的博客此处找到有用的信息.我有点疏远将它与StructureMap(而不是Castle Windsor)集成.你可以在这里找到一些信息.
要做你想要实现的目标,你必须定义一个实现IEntityInformationExtractor接口的类.

首先,您必须添加以下引用(我已经使用NH 3.0重新编译了Rhino Security):

  • 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));
    }
}
Run Code Online (Sandbox Code Playgroud)

然后定义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>()));
                });
    }
}
Run Code Online (Sandbox Code Playgroud)

NHSessionFactory基本上创建了一个NH会话工厂.

我创建了一个实现IEntityInformationExtractor 的类(TaskInfromationExtractor).这将允许您为任务实体定义权限.现在您的应用已经准备就绪 你只需要"bootstrap"结构图:

  • Bootstrapper.Initialize();

当你的应用程序启动时,你会这样做.现在您可以使用Rhino安全存储库和服务来创建用户,组,关系等等,作为我给你建议的链接.你可以在这里找到我准备的样品