4

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

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

4

3 回答 3

5

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

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

  • Microsoft.Practices.ServiceLocation
  • 休眠
  • NHibernate.ByteCode.Castle
  • 结构图
  • Rhino.Security
  • 结构映射适配器

然后定义一个引导程序:

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 )。这将允许您为任务实体定义权限。现在您的应用程序已准备就绪。你只需要“引导”结构图:

  • 引导程序。初始化();

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

于 2011-01-28T08:39:30.583 回答
1

也看看这个。它很容易使用。

http://code.google.com/p/saf-framework/

于 2011-06-02T00:38:32.793 回答
1

我认为asp.net mvc 属性将适合此类任务。

首先,您需要创建一些角色列表并以某种方式与用户一起引用它。登录后,您需要在 Session 中存储用户角色。比使用此属性标记控制器或操作。在属性中,您应该传递需要执行某些操作的角色。在属性实现中,您只需检查用户是否具有某些角色然后无事可做,否则重定向到未授权页面。或者抛出一些自定义异常并在 global.asax 中重定向。

Mb 查看本文以获取代码示例。

于 2011-01-28T09:00:41.750 回答