Orchard 中忽略的权限默认值

Permission defaults ignored in Orchard

我尝试为我的新模块设置权限。否则它们似乎可以工作,但忽略默认值,不会检查我在代码中设置的角色权限对。我的代码 (Permissions.cs) 似乎没问题:

using System.Collections.Generic;
using Orchard.Environment.Extensions.Models;
using Orchard.Security.Permissions;
using Orchard.Environment.Extensions;
using My.Module.Utils;

namespace My.Module
{
    public class Permissions : IPermissionProvider {
        public static readonly Permission AccessMyModule = new Permission { 
            Description = Constants.AccessAddon, Name = "AccessMyModule" 
        };

        public virtual Feature Feature { get; set; }

        public IEnumerable<Permission> GetPermissions() {
            return new[] {
                AccessMyModule
            };
        }

        public IEnumerable<PermissionStereotype> GetDefaultStereotypes() {
            return new[] {
                new PermissionStereotype {
                    Name = Constants.MyModuleAdministratorRole,
                    Permissions = new[] { AccessMyModule }
                }
            };
        }
    }
}

我仔细检查了存储在 Constants 中的所有常量及其引用是否有效。这里的代码片段被简化了,事实上我在我的项目中有更多的权限和更多的角色,但我确认注释掉除了一个权限和一个角色之外的所有内容并不能解决问题。同一解决方案中其他模块的默认设置工作正常,尽管 IntelliSense 没有报告任何错误,并且模块中的其他所有内容似乎都可以工作。那么还有什么地方可能是问题的根源呢?

编辑:我关注@mdameer 的评论并确认 GetDefaultStereotypes() 确实 运行 仅在重新安装后。但是,重新安装后启用模块时发生错误,因此未加载默认值。我知道假定的方法是检查角色 - 仪表板中的权限名称,但我想找到另一种解决方法,因为

正在从 Orchard.Roles 中的 class DefaultRoleUpdater 调用 GetDefaultStereotypes() 方法。它是从 Orchard 核心深处的某个地方自动调用的,因此简单地模仿调用并 运行 在启动时调用它并不是那么容易。我还尝试模仿整个功能并将其放入我的 permissions class(或自定义服务),但现在我迷失了如何 运行 它。它不是静态的,但它是我的 Permissions class 的一部分或引用它,默认情况下不允许普通引用(它没有适当的构造函数),我不想通过将 class 更改为不应该也不应该的东西,它会变得更加混乱。

只需设置迁移中所需的默认权限,而不是使用 GetDefaultStereotypes()。这是一个简短的例子:

public class MyMigration: Orchard.Data.Migration.DataMigrationImpl
{
  // public
    public MyMigration(Orchard.Roles.Services.IRoleService aRoleService)
    {
      mRoleService = aRoleService;
    }

    public int Create()
    {
      //mRoleService.CreateRole("MyRoleName");
      //mRoleService.UpdateRole("MyRoleName", MyPermissions)

      return 1;
    }

  // private
    Orchard.Roles.Services.IRoleService aRoleService mRoleService;
}