0

我不知道该去哪里解决我的问题。我想创建一个自定义授权属性来检查角色和权限。我们的权限不是您的标准,这个角色有这些权限,但更多的是每个角色可以有一些权限,但不能有其他权限。

我已经覆盖了 AuthorizeAttribute 类中的 AuthorizeCore 方法:

 internal class RoleAttribute : AuthorizeAttribute
{
    private readonly IUserRepository _userRepository;
    private readonly IPermissionRepository _permissionRepository;

    public RoleAttribute(IUserRepository userRepository, IPermissionRepository permissionRepository)
    {
        _userRepository = userRepository;
        _permissionRepository = permissionRepository;
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        User user = _userRepository.GetUsers();
        Permission permission = _permissionRepository.GetPermissions();
        return user.Permissions.Where(x => x.Id == permission.Id).Any();
    }
}

这样当我实现属性时:

         private static IUserRepository _userRepository;
    private static IPermissionRepository _permissionRepository;

    public TopNavigationController(IUserRepository userRepository, IPermissionRepository permissionRepository)
    {
        _userRepository = userRepository;
        _permissionRepository = permissionRepository;
    }

    [Role(_userRepository, _permissionRepository)]
    public ActionResult MethodThatHasStuff()
    {
         //Do stuff return stuff if user has the permissions
    }

我不能依赖注入到被覆盖的方法中,因为我不能将注入传递到属性中。

我意识到这不是解决问题的好方法,但直到我们可以与客户一起解决一些问题,使我们朝着更好的实践迈进,我需要相应地开发。

我的主要问题是:是否有更好的方法来创建允许这种行为的自定义授权过滤器?

4

1 回答 1

1

如果您认为仅仅因为您在控制器中实例化了存储库,那么每个请求都将使用相同的实例,那么您就错了。每次都会实例化控制器。结果,您并没有通过简单地实例化属性中的存储库来节省太多。考虑到使用属性的局限性,实际上没有更好的方法可以让它访问依赖项,并且在控制器上使用静态是一个非常糟糕的主意。

于 2013-04-18T14:37:33.570 回答