C# ASP.NET MVC-如何根据登录用户隐藏或显示链接/按钮';角色权限?
我正在使用ASP.NET MVC4 这是我的用户角色C# ASP.NET MVC-如何根据登录用户隐藏或显示链接/按钮';角色权限?,c#,asp.net-mvc,asp.net-mvc-3,C#,Asp.net Mvc,Asp.net Mvc 3,我正在使用ASP.NET MVC4 这是我的用户角色 1. Administrator 2. L1 Admin 3. L2 Admin 管理员组用户具有设置权限(用于添加、权限设置)。 查看日志、错误报告等 如果用户是管理员组的成员,则只能看到与上述设置相关的菜单 我有一张菜单表,上面有菜单的细节。有一些功能,如删除、编辑,根据当前用户的角色显示,在顶部菜单中不可用。“删除、编辑”链接在列出数据时放置在表中。这也包括在内,对于该类型的条目,IsVisible为false MenuID - Me
1. Administrator
2. L1 Admin
3. L2 Admin
管理员组用户具有设置权限(用于添加、权限设置)。
查看日志、错误报告等
如果用户是管理员组的成员,则只能看到与上述设置相关的菜单
我有一张菜单表,上面有菜单的细节。有一些功能,如删除、编辑,根据当前用户的角色显示,在顶部菜单中不可用。“删除、编辑”链接在列出数据时放置在表中。这也包括在内,对于该类型的条目,IsVisible为false
MenuID - MenuName - Controller - Action - ParentID - IsVisible
我有一个roleMenu表,有分配给每个角色的菜单
RoleID - MenuID
若管理员正在登录,他可以看到所有菜单。
如果L1Admin正在登录,他只能看到分配给他的菜单
我创建了一个用于身份验证的自定义属性,然后查询数据库,并根据控件和操作(table Menu joins RoleMenu)获取用户的权限。因此,如果用户试图通过在浏览器中键入URL来访问操作,我可以限制请求
如果我以L1Admin的身份输入,我只能看到列表页面,并且菜单被正确创建。
在列表页面中,我正在使用列表。那么,如何根据登录用户的权限隐藏编辑/详细信息链接呢
<div style="float: left">
<table width="50%">
<tr>
<th>
@Html.DisplayNameFor(model => model.Name)
</th>
<th>
</th>
</tr>
@foreach (var item in Model)
{
<tr>
<td style="width:30%;">
@Html.DisplayFor(modelItem => item.Name)
</td>
<td style="width:20%;">
// I need to hide EDIT/DELETE based on the permission setting of Current logged in user.
@Html.ActionLink("Edit", "Edit", new { id = item.ID }) |
<a href="Server/@item.ID">Details</a> |
@Html.ActionLink("Delete", "Delete", new { id = item.ID })
</td>
</tr>
}
</table>
</div>
@DisplayNameFor(model=>model.Name)
@foreach(模型中的var项目)
{
@DisplayFor(modelItem=>item.Name)
//我需要根据当前登录用户的权限设置隐藏编辑/删除。
@ActionLink(“编辑”,“编辑”,新的{id=item.id})|
|
@ActionLink(“删除”,“删除”,新的{id=item.id})
}
提前谢谢
编辑
我正在将权限详细信息存储在数据库中。例如,您可以这样做:
@if (ViewContext.HttpContext.User.IsInRole("Your role"))
{
// Do something here
}
创建如下自定义帮助程序扩展,其中CustomMethodForRetrievingUserFlag()返回用户权限,CustomMethodForRetrievingFlags返回允许的操作权限。祝你好运 视图中的用法:@Url.CustomUrl(“主页”、“索引”)
选项1-考虑到您使用的是asp.net成员身份
@if (Roles.IsUserInRole("Administrator"))
{
//show link
}
else
{
//hide link/button
}
选项2-在用户数据中指定角色,以防您自己创建AuthCookie,然后在应用程序\u PostAuthenticateRequest方法的Global.asax.cs文件中将HttpContext.Current.User设置为新的GenericPrinciple(从AuthCookie的用户数据中获取用户角色)-将实现留给google。
这应该在以后起作用
System.Web.HttpContext.Current.User.IsInRole("RoleName");
由于将权限详细信息存储在数据库中, 您可以通过以下方式检查权限
选项1
创建授权操作链接扩展
创建一个自定义的html授权ActionLink并调用,如下所示
<ul id="menu">
<li><%: Html.ActionLink("Home", "Index", "Home")%></li>
<li><%: Html.ActionLink("About", "About", "Home")%></li>
// Next line What you are looking for
<li><%: Html.ActionLinkAuthorized("The Privilege Zone", "ThePrivilegeZone", "Home", true)%></li>
</ul>
@if(User.Identity.IsAuthenticated)//检查用户是否经过身份验证
{
if(User.IsInRole(“HR”)//检查该用户是否担任该角色
{
//要为该角色显示的内容!
//将向角色HR的用户显示的一些示例内容
人力资源审批
批准
拒绝
}
}
但如果有提交按钮。我将如何隐藏或禁用?L2Admin可以保存数据,但只有L1Admin可以对其进行授权。L1 Admin和L2 Admin可以同时看到这两个按钮,但根据它们的权限,它将被隐藏或禁用。如果您不打算提交任何数据,请在表单中添加“#”操作。创建一个自定义扩展名,如Html.BeginForm,以返回表单元素或不返回任何内容。但如果我使用数据库中的自定义角色,请执行此操作。那怎么办?我已经更新了答案。如果您需要更多详细信息,请告诉我。我鼓励你用谷歌搜索这些条款,并发现其中的细节,因为身份验证是一个非常敏感的问题,你应该知道。嗨,VeekKayBee,我有类似的要求,你对此有解决方案吗?@gs11111是的,我从下面的答案中得到了解决方案。只要把所有的解决办法通读一遍,你就会有一些想法。我不能建议一个正确的答案。所有的答案都给了我实现这一目标的投入。我仔细研究了解决方案,但我不知道如何应用它。你能概述一下你申请的解决方案吗?这将是一个很好的选择help@gs11111很抱歉,我现在只看到您的评论:(我创建了一个包含权限子类的用户对象。根据为页面中每个角色指定的访问权限,我刚刚创建了一个Html.helper函数,返回true或false。此函数将评估权限设置并切换控件的可见性。
<ul id="menu">
<li><%: Html.ActionLink("Home", "Index", "Home")%></li>
<li><%: Html.ActionLink("About", "About", "Home")%></li>
// Next line What you are looking for
<li><%: Html.ActionLinkAuthorized("The Privilege Zone", "ThePrivilegeZone", "Home", true)%></li>
</ul>
public static bool IsUserInRole(string rolenamefrom session)
{
// Check the user have the privilege then return true/false
}
@if (IsUserInRole("Administrator"))
{ //show link }
else
{//hide link/button}
@if (User.Identity.IsAuthenticated)// check whether the user is authenticated or not
{
if (User.IsInRole("HR"))//Check wether the user is in that role
{
//Contents to be displayed for that Role!
//some sample content which will be displayed to the user of a Role HR
<div>
<h5><strong>HR Approval</strong></h5>
</div>
<div>
<button type="button" name="btnApprove" id="btnApprove">Approve</button>
<button type="button" name="btnReject" id="btnReject">Reject</button>
</div>
<br />
}
}