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

时间:2011-01-27 22:14:31

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

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

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

3 个答案:

答案 0 :(得分:5)

恐怕Rhino Security依赖Nhibernate工作 我一直在评估Rhino Security几个月,最后,我决定使用它,因为它是一个非常好的产品。
您可以在Ayende bloghere找到有用的信息。 我有点疏远将它与StructureMap(而不是Castle Windsor)集成。您可以找到一些信息here 要做你想要实现的目标,你必须定义一个实现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));
    }
}

然后定义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

答案 1 :(得分:1)

我认为asp.net mvc attributes对于这样的任务会有好处。

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

Mb检查this文章以获取代码示例。

答案 2 :(得分:1)

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

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