C# ASP.NET MVC-如何根据登录用户隐藏或显示链接/按钮';角色权限?

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

我正在使用ASP.NET MVC4

这是我的用户角色

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