基于服务/控制器响应的条件Html.Action渲染

时间:2017-09-24 10:08:51

标签: c# asp.net-mvc conditional ninject html.actionlink

我们的ASP.NET MVC 5.0应用程序正在使用ASP.NET中的用户和角色,但使用自定义权限扩展它。根据用户角色的具体权限,它们需要非常精细和动态的授权属性和链接呈现。

例如:

许可名称:Products.Edit
用户:MyUser
UserRoles:Admin,ProductsAdmin
角色权限:X,Y,Z ...... Products.Edit ... n

我有一个服务,它接受如下角色列表:

public interface PermissionServiceInterface
{
    bool HasPermission(string permissionNameIdentifier, params string[] roles);
}

我使用Ninject创建了一个自定义的Authenticate属性,可以应用于控制器或这样的动作:

[PermissionAuthorize("Products.Edit")]
public ProductsController()
{
}

现在,我想根据用户角色是否具有特定权限,有条件地在视图中呈现链接。

类似的东西:

@Html.ActionLink("Create Product", "Create").If("Products.Edit")

使用这样的静态扩展方法:

public static MvcHtmlString If(this MvcHtmlString value, string permission)
{
    return permissionService.HasPermission(permission) ? value : 
    MvcHtmlString.Empty;
}

问题在于您无法将依赖项注入静态扩展类。

这给了我一些选择,但似乎都有点过分了。

  1. 创建自定义IPrinciple以包含User.HasPermission(" permission")。这是很多工作。
  2. 将它放入剃刀@helper函数中,该函数调用控制器来评估这种情况。但是Views应该不知道控制器,所以这违背了MVC的整个原则。
  3. 将其放入某个常规类/方法中,但现在需要设置Ninject以了解并实例化这些类。
  4. 使用静态扩展类,但使用ninject容器作为服务定位器来解析依赖性。
  5. 这些都是理想的吗?还有其他更简单的方法吗?

    谢谢你们!

0 个答案:

没有答案