我正在使用ASP.NET MVC 4应用程序。我有一个仪表板,我的用户组将基于Windows域 所以我使用WIndows身份验证来验证用户身份。 我创建了示例应用程序,它通过覆盖函数AuthorizeAttribute,ActionFilterAttribute使用自定义身份验证。这是一个好方法吗?
- 哪种属性最适合用于身份验证?
醇>
我有一个仪表板。所以我需要根据角色显示或隐藏控件。 假设有3个网格(表),如果Admin登录,他可以看到3个网格(表格)。 但是如果支持用户登录,他只能看到2个网格(表格)。
我的计划是为每个网格创建部分视图,因此每个局部视图都会有一个Action和Controller。 将有一个数据库,我将指定每个组可以执行的操作。这样我就可以过滤请求了。
2如何根据角色隐藏或显示部分视图?
我尝试了一些SO链接,但所有他们都在讨论2,3个角色并且它是硬编码的。 在我看来,角色可能会有所不同,我们使用db来设置角色访问权限。
提前致谢。
答案 0 :(得分:19)
您可以使用以下代码进行基于角色的检查
@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>
}
答案 1 :(得分:11)
通常,您希望尽可能保持视图干净,几乎没有逻辑。 我建议将角色检查逻辑移动到控制器操作中,并根据用户角色呈现部分视图。
您可以使用ChildActions和Html.Action扩展方法将其连线。
来自MSDN:
子操作方法为视图的一部分呈现内联HTML标记 而不是渲染整个视图。任何标有的方法 只能使用Action或者调用ChildActionOnlyAttribute 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")
答案 2 :(得分:3)
我做了类似的事情。我这样做的方式(可能不是最好的)
是将一个布尔值发送回视图
在控制器中使用:
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的方法,该方法返回用户的角色。