26

我正在使用 ASP.NET MVC4。

这是我的用户角色

1. Administrator
2. L1 Admin
3. L2 Admin

管理员组用户具有设置权限(用于添加、权限设置)。查看日志、错误报告等

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

我有一个菜单表,有菜单详细信息。有一些功能,如删除、编辑,根据当前用户的角色显示,在顶部菜单中不可用。列出数据时,删除、编辑链接放置在表内。这也包括并且对于那种类型的 entry , IsVisible 是错误的。

MenuID - MenuName - Controller - Action - ParentID - IsVisible

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

RoleID - MenuID

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

我创建了一个用于身份验证的自定义属性,然后我查询数据库并根据 Contoller 和 Action(表 Menu 加入 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>

提前致谢。

编辑

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

4

5 回答 5

46

例如,您可以通过以下方式执行此操作:

@if (ViewContext.HttpContext.User.IsInRole("Your role"))
{
    // Do something here
}
于 2012-07-26T11:39:35.620 回答
16

选项 1 - 考虑到您正在使用 asp .net 会员资格。

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

选项 2 - 在 userData 中指定角色,以防您自己创建AuthCookie,然后在 Global.asax.cs 文件的 Application_PostAuthenticateRequest 方法上将 HttpContext.Current.User 设置为新的 GenericPrinciple(从 authcookie 的用户数据中获取用户角色) - 将实现保留在你去谷歌。

这应该稍后工作

System.Web.HttpContext.Current.User.IsInRole("RoleName");
于 2012-07-26T11:49:41.953 回答
6

由于将权限详细信息存储在数据库中,您可以通过以下方式检查权限

Option 1 创建授权操作链接扩展演示

创建一个自定义 html Authorized 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}
于 2014-03-22T15:13:12.583 回答
5

制作一个像这样的自定义帮助程序扩展,其中 CustomMethodForRetrievingUserFlag() 返回用户权限,CustomMethodForRetrievingFlags 返回例如操作的允许权限。祝你好运。

视图用法:@Url.CustomUrl("Home", "Index")

[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
    }
}
于 2012-07-26T11:42:43.653 回答
3
@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 />
        }
    }
于 2020-06-29T09:12:49.430 回答