2012-07-26 180 views
19

我正在使用ASP.NET MVC4。ASP.NET MVC - 如何根据登录的用户角色权限隐藏或显示链接/按钮?

这是我的UserRole

1. Administrator 
2. L1 Admin 
3. L2 Admin 

管理员组的用户对设置(使用添加,权限设置)的权限。 查看日志,错误报告等。

如果用户是管理员组的成员,他只能看到与上述设置相关的菜单。

我有一个菜单表,有菜单的细节。有一些功能,如删除,编辑,这些功能基于当前用户的角色显示,并且不在顶部菜单中提供。列出数据时,删除,编辑链接放置在表格内。这也包括,对于这种类型的入口,IsVisible是错误的。

MenuID - MenuName - Controller - Action - ParentID - IsVisible 

我有一个roleMenu表,具有被分配给每个角色的菜单。

RoleID - MenuID 

如果Admininstrator正在登录,他可以看到所有菜单。 如果L1Admin正在登录,他只能看到分配给他的菜单。

我创建了一个用于身份验证的自定义属性,之后我查询数据库并根据Contoller和Action(表菜单加入RoleMenu)获取用户权限。所以如果用户通过输入浏览器尝试访问通过URL的操作,我可以限制请求。

如果我是以L1Admin的身份输入的,我只能看到列表页面,并且菜单是创建correclty。 在我用于列表的列表页面中。那么如何隐藏基于登录用户权限的编辑/详细信息链接。

<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> 

在此先感谢。

编辑

我存储在数据库的权限的详细信息。

+0

喜VeekKayBee,我也有类似的要求,你得到的解决方案呢? – gs11111 2014-07-16 07:17:06

+0

@ gs11111是的,我从下面的答案得到了解决方案。只要通过所有的解决方案,你会得到一些想法。我不能建议一个正确的答案。所有的答案给我的投入来实现这一点。 – kbvishnu 2014-07-16 08:14:11

+0

我经历了解决方案,但我无法弄清楚如何应用它。你可以请你概述你申请的解决方案。这将是一个很好的帮助 – gs11111 2014-07-16 10:16:50

回答

36

例如,你可以做到这一点在这样一个办法:

@if (ViewContext.HttpContext.User.IsInRole("Your role")) 
{ 
    // Do something here 
} 
4

创建自定义帮助扩展这个样子,哪里CustomMethodForRetrievingUserFlag()返回用户权限,CustomMethodForRetrievingFlags允许的权限,例如一个动作的回报。祝你好运。从图

用法:@ Url.CustomUrl( “家”, “指数”)

[Flags] 
public enum AuthorizeFlags 
{ 
    Administrator = 1, 
    L1 = 2, 
    L2 = 4 
} 

public static class UrlHelperExtensions 
{ 
    public static MvcHtmlString CustomUrl(this UrlHelper urlHelper, string controllerName, string actionName, object routeValues = null) 
    { 
     var actionFlag = CustomMethodForRetrievingFlags(actionName); 
     var userFlag = CustomMethodForRetrievingUserFlag(); 

     if ((actionFlag & userFlag) == userFlag) 
     { 
      return new MvcHtmlString(urlHelper.Action(actionName, controllerName, routeValues)); 
     } 

     return new MvcHtmlString(String.Empty); 
    } 

    private static AuthorizeFlags CustomMethodForRetrievingUserFlag() 
    { 
     return AuthorizeFlags.L2; 
    } 

    private static AuthorizeFlags CustomMethodForRetrievingFlags(string actionName) 
    { 
     return (AuthorizeFlags.Administrator | AuthorizeFlags.L1); // test stub 
    } 
} 
+0

但是在提交按钮的情况下,我将如何隐藏或禁用? L2Admin可以保存数据,但是只有L1Admin可以授权,所以L1 Admin和L2 admin可以同时看到这两个按钮,但是根据他们的权限会隐藏或禁用。 – kbvishnu 2012-07-26 11:49:42

+0

如果不是,请在表单中添加一个“#”动作要提交任何数据 – 2012-07-26 11:51:01

+0

的意思是?我没有得到你 – kbvishnu 2012-07-26 11:52:48

9

选项1 - 考虑到你正在使用ASP.NET的成员资格。

@if (Roles.IsUserInRole("Administrator")) 
{ 
    //show link 
} 
else 
{ 
    //hide link/button 
} 

选项2 - 指定情况下,用户数据角色要创建你自己的AuthCookie,以后再设置HttpContext.Current。User到新的GenericPrinciple(从authcookie的userdata获取userrole)Global.asax.cs文件的Application_PostAuthenticateRequest方法 - 将您的实现留在Google上。

这应该工作后

System.Web.HttpContext.Current.User.IsInRole("RoleName"); 
+0

但是如果我从我的数据库使用自定义角色。那么如何? – kbvishnu 2012-07-26 11:50:28

+0

我已经更新了我的答案。让我知道你是否需要更多细节。我鼓励你谷歌的条款和发现洞察鉴定是真正敏感的主题,你应该知道。 – RollerCosta 2017-03-16 07:13:34

4

因为存储在数据库中的权限的详细信息的, 可以检查权限为以下几个方面

Option 1创建一个授权的动作链路扩展Demo

创建自定义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> 

注:为更好的安全性,您需要自定义操作过滤器检查所有请求被授权。

Option 2 创建一个静态的功能和作用的链接前检查

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} 
相关问题