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

Asp.net mvc 2 查找要在ASP.NET MVC项目上使用的授权框架,asp.net-mvc-2,authorization,rhino-security,Asp.net Mvc 2,Authorization,Rhino Security,我有一个asp.NETMVC项目,持久化由存储库处理。使用表单身份验证。现在我需要实现授权。例如,我需要确保经理用户只能打开他/她的任务并为任务分配工作人员。工人只能看到分配给他的任务。超级版主可以编辑所有内容。 是否有任何现成的框架允许我定义权限 我正在评估Ayende Rhino的安全性。在哪里可以获得更多示例代码?您对Rhino安全有何看法? 我的项目使用LINQtoSQL,没有使用NHibernate。Rhino Security在没有NHibernate的情况下可以工作吗?恐怕Rhin

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

我正在评估Ayende Rhino的安全性。在哪里可以获得更多示例代码?您对Rhino安全有何看法?

我的项目使用LINQtoSQL,没有使用NHibernate。Rhino Security在没有NHibernate的情况下可以工作吗?

恐怕Rhino Security需要NHibernate才能工作。
我已经对Rhino的安全性进行了几个月的评估,最后,我决定使用它,因为它是一款非常好的产品。
你可以在Ayende's或上找到有用的信息。 我花了点时间将它与StructureMap(而不是温莎城堡)集成。您可以找到一些信息。
要实现您试图实现的目标,必须定义一个实现IEntityInformationExtractor接口的类

首先,您必须添加以下引用(我用NH3.0重新编译了Rhino Security):

  • Microsoft.Practices.ServiceLocation
  • 亚硝酸铵
  • NHibernate.ByteCode.Castle
  • 结构图
  • Rhino.安全
然后定义一个引导程序:

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));
    }
}
公共静态类引导程序
{
公共静态void Initialize()
{
ObjectFactory.Initialize(cfg=>
{
cfg.UseDefaultStructureMapConfigFile=false;
cfg.IgnoreStructureMapConfig=true;
cfg.AddRegistry();
});
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>()));
                });
    }
}
公共类结构映射注册表:注册表
{
公共结构映射注册表()
{
string ConnDb=“数据源=(本地);初始目录=安全性测试;可信连接=真;”;
For()
.Singleton()
默认值是由(()=>newNHSessionFactory(ConnDb,false).SessionFactory)构造的;
For()
.Singleton()
.TheDefault.Is.ConstructedBy(x=>x.GetInstance().OpenSession());
For()
.使用我认为对这样的任务会有好处

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


Mb查看文章中的代码示例。

也可以查看这篇文章。它很容易使用


非常感谢这些链接。欢迎使用任何示例代码。我的项目使用Ninject,但Rhino Security自述文件中说“Rhino Security使用公共服务定位器()”。这会有问题吗。提前感谢您提供的所有资源。是的,这就是我切换到StructureMap的原因,嗯,不是唯一的原因…我必须说我现在对s.M.更满意。我已经更新了我的答案。您可以找到示例应用程序的链接。有时更容易阅读一些代码。再次感谢。示例非常有用。我很高兴你发现了一些有用的东西。我在想办法解决所有问题时遇到了一些困难。谢谢你提供的链接和说明。我会测试一下。