17

我正在开发 ASP.NET MVC 4 应用程序。我有一个仪表板,我的用户组将基于 Windows 域,所以我使用 WIndows 身份验证对用户进行身份验证。我创建了通过覆盖函数 AuthorizeAttribute, ActionFilterAttribute 使用自定义身份验证的示例应用程序。这是一个好方法吗?

  1. 哪个属性最适合用于身份验证?

我有一个仪表板。所以我需要根据角色显示或隐藏控件。假设如果有 3 个网格(表),如果管理员登录,他可以看到 3 个网格(表)。但如果支持用户登录,他只能看到 2 个网格(表格)。

我的计划是为每个网格创建局部视图,因此每个局部视图都会有一个动作和控制器。将有一个数据库,其中我将指定每个组可以执行的操作。这样我就可以过滤请求。

2 如何隐藏或显示基于角色的部分视图?

我尝试了一些 SO 链接,但他们都在谈论 2,3 角色并且它是硬编码的。在我的情况下,角色可能会有所不同,我们使用 db 来设置角色的访问权限。

提前致谢。

4

3 回答 3

22

您可以使用以下代码进行基于角色的检查

@if(Request.IsAuthenticated)

{
    if(User.IsInRole("Admin"))
    {
     <Ul Class="SubMenuItem">

     <li> this menu item is for Admin role</li>
     </Ul>
    }
     if(User.IsInRole("User"))
    {
     <Ul Class="SubMenuItem">

     <li> this menu item is for User role</li>
     </Ul>
    }
}
@* For unknown user *@
else
{
     <Ul Class="SubMenuItem">
         <li> this menu item is for Unknown user</li>
     </Ul>
}
于 2013-03-25T07:39:42.553 回答
13

通常,您希望保持视图尽可能干净,几乎没有逻辑。我建议将您的角色检查逻辑移动到控制器操作中,并根据用户角色呈现部分视图。

您可以使用ChildActions和 Html.Action 扩展方法来连接它。

来自 MSDN:

子操作方法为视图的一部分呈现内联 HTML 标记,而不是呈现整个视图。任何标有 ChildActionOnlyAttribute 的方法只能使用 Action 或 RenderAction HTML 扩展方法调用。

在您的项目中,创建一个名为Dashboard的新 Controller并添加一个名为BuildTable的 Action 。

public class DashboardController : Controller
{
    [ChildActionOnly]
    public ActionResult BuildTable()
    {
        if (Roles.IsUserInRole("Administrator"))
        {
            return PartialView("_AdminTable");
        }

        return PartialView("_SupportTable");
    }
}

在您希望仪表板表出现的视图中包括以下行。

@Html.Action("BuildTable", "Dashboard")
于 2014-07-12T04:30:51.273 回答
6

我做过类似的事情。我做的方式(可能不是最好的)

是将布尔值发送回视图

在控制器中使用:

bool showSection1 = true;
bool showSection2 = false;

ViewData["showSection1"] = showSection1;
ViewData["showSection2"] = showSection2;
/// may be better to use a viewmodel here rather than ViewData

然后在视图中:

@if((bool)ViewData["showSection1"])
{
    @{Html.RenderPartial("section1");}
}
@if((bool)ViewData["showSection2"))
{
    @{Html.RenderPartial("Section2");}
}

您将需要执行逻辑以按照您想要的方式设置布尔值,但这应该是一个开始。

您还可以创建一个返回角色的静态方法,然后直接从视图中获取该值。不过,这可能是不好的形式。

@if(AppHelper.GetRole().equals("role1")){
    //show the partial
}

然后创建一个名为 AppHelper 的类和一个名为 GetRole 的方法,该方法返回用户的角色。

于 2012-08-06T15:19:42.523 回答