部分视图和元素的MVC授权

时间:2013-05-31 22:38:35

标签: c# security asp.net-mvc-4 authorization

MSDN说:

  

要限制对ASP.NET MVC视图的访问,请限制对呈现视图的操作方法的访问。   为此,MVC框架提供了AuthorizeAttribute类。

我正在使用正在加载嵌套部分视图的应用程序(缺少更好的术语)

public ActionResult Index(int id)
{
....stuff.....

return PartialView("PartialViewName", model);

}

在上面加载的部分视图中,嵌套就像:

PartialView.cshtml

@Html.Partial("AnotherPartial", Model)
  -@Html.Partial("AnotherPartial_Partial", Model)
    -@Html.Partial("AnotherPartial_Partial_Partial", Model)
@Html.Partial("YetAnotherPartial", Model)
@Html.Partial("StillAnotherPartial", Model)

当我想允许访问一个局部视图但不允许访问另一个局部视图时,我该怎么办?这些部分中的具体元素怎么样?像按钮,面板,div,文本框等......

我在我的数据库中定义了用户和角色,因此我知道谁可以访问哪个元素/部分视图。

目前我正在使用自己的Html Helper来显示或隐藏部分视图:

public static MvcHtmlString ShowHidePartial(this HtmlHelper helper, string   partialName, TheUser user)
    {
        bool? isVisible = false;

        //If I don't know who you are or what you are trying to view
        if (user == null || string.IsNullOrEmpty(partialName))
        {
            return MvcHtmlString.Empty;
        }

        if (IsAdmin(user))
        {
            return MvcHtmlString.Create(helper.Partial(partialName).ToString());
        }
        else
        {
            isVisible = IsVisible(partialName, user);
        }

        if (isVisible == true)
        {
            return MvcHtmlString.Create(helper.Partial(partialName).ToString());
        }

        return  MvcHtmlString.Empty;
    }

我可能会坚持使用这种方法来渲染部分内容,但我仍然不确定如何继续限制对这些部分中元素的访问/可见性。

例如,如果用户有权访问AnotherPartial.cshtml,并且该部分有4个部分允许用户查看/编辑信息(如成员地址,成员状态,成员电话和成员出生日期)使用更新/保存按钮。这些部分是AnotherPartial.cshtml独有的。

假设我只想让用户查看(ReadOnly)2个部分,编辑(ReadWrite)1部分,并完全隐藏第4部分(隐藏?...无访问权限)。我将如何实现这一目标?

我正在使用Windows身份验证来访问该应用程序。

1 个答案:

答案 0 :(得分:0)

我不确定你是否有与这些偏见相关的动作,但看起来你想要使用Html.Partial,这样你就不必一遍又一遍地重建你的模型。在你的情况下我会做的一件事就是传递你想要显示那些部分的角色。在这种情况下你必须要小心,因为这并不完全符合Separation of Concerns的概念,因为你在视图中提供了一些业务逻辑。但似乎你已经走了这条路。因此,为了扩展您的方法,您可以执行以下操作。 我假设你的TheUser类有一个Roles属性。

public static MvcHtmlString ShowHidePartial(this HtmlHelper helper, string   partialName, TheUser user, string [] roles)
{
            if(roles = null)
            {
                  return MvcHtmlString.Empty;
            }

    //If I don't know who you are or what you are trying to view        
    if(user != null && !string.IsNullOrEmpty(partialName) && user.Roles.Any(r=> roles.Contains(r)) )
    {
        return MvcHtmlString.Create(helper.Partial(partialName).ToString());
    }

    return  MvcHtmlString.Empty;
}

所以现在你的观点看起来像这样:

@Html.ShowHidePartial("AnotherPartial", Model, new string[] {"AuthorizedRole1", "AuthorizedRole2"})
  -@Html.ShowHidePartial("AnotherPartial_Partial", Model, new string[] {"AuthorizedRole1"})
    -@Html.ShowHidePartial("AnotherPartial_Partial_Partial", Model, new string[] {"AuthorizedRole1", "AuthorizedRole3"})
@Html.ShowHidePartial("YetAnotherPartial", Model, new string[] {})
@Html.ShowHidePartial("StillAnotherPartial", Model, new string[] {})

选项2 根据角色构建视图,例如包含管理视图所需部分的AdminView.cshtml。然后在您的业务逻辑代码中决定要执行的视图。这将完全发生在视图代码之外,并且符合分离关注的概念。