【问题标题】:Finding authorization framework to be used on a ASP.NET MVC project查找要在 ASP.NET MVC 项目上使用的授权框架
【发布时间】:2011-01-27 22:14:30
【问题描述】:

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

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

【问题讨论】:

    标签: asp.net-mvc-2 authorization rhino-security


    【解决方案1】:

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

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

    • Microsoft.Practices.ServiceLocation
    • NHibernate
    • NHibernate.ByteCode.Castle
    • 结构图
    • 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

    【讨论】:

    • 非常感谢您的链接。任何示例代码都将受到欢迎。我的项目使用 Ninject,但 Rhino Security 自述文件说“Rhino Security 使用 Common Service Locator (codeplex.com/CommonServiceLocator)”。那会不会是个问题。提前感谢您提供的任何资源。
    • 是的,这就是我切换到 StructureMap 的原因,嗯,不是唯一的……我必须说我对 S.M. 更满意。现在。
    • 我已经更新了我的答案。您可以找到示例应用程序的链接。有时阅读一些代码会更容易。
    • 再次感谢。该示例很有帮助。
    • 我很高兴您能找到有用的东西。我在试图弄清楚所有事情时遇到了一些麻烦。
    【解决方案2】:

    我认为asp.net mvc attributes 会适合这样的任务。

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

    Mb 检查this 文章代码示例。

    【讨论】:

    • 感谢您的链接和指导。我会测试一下。
    【解决方案3】:

    也看看这个。它易于使用。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多