2011-01-27 29 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。