【问题标题】:Dynamic access to actionresults动态访问操作结果
【发布时间】:2014-09-01 17:24:16
【问题描述】:

允许具有角色的用户动态访问控制器方法。 我有一个典型的场景,我希望允许用户动态访问页面,因为每个角色的权限集都可以通过用户界面进行更改。 我有三个 actionresult

控制器:

 public class HomeController : Controller
 {
[CustomAuthorize(Roles="Admin")]
Public Actionresult UI01(){
return View();
}

[CustomAuthorize(Roles="Admin")]
Public Actionresult UI02(){
return View();
}

[CustomAuthorize(Roles="Admin")]
Public Actionresult UI03(){
return View();
}
}

查看: 我通过检查管理员角色来隐藏菜单项。

@*menu items*@
  @if((Roles.IsUserInRole("Admin")){
  <li>@Html.ActionLink("Rating", "UI01", "Home")</li>
}
@if((Roles.IsUserInRole("Admin")){

  <li>@Html.ActionLink("Map", "UI02", "Home")</li>
}
@if((Roles.IsUserInRole("Admin")){
  <li>@Html.ActionLink("Sales", "UI03", "Home")</li>
}

授权属性类:

public class CustomAuthorize : AuthorizeAttribute
    {
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
            {
                base.HandleUnauthorizedRequest(filterContext);
            }
            else
            {
                filterContext.Result = new RedirectToRouteResult(new
                RouteValueDictionary(new { controller = "Account", action = "Error" }));
            }
        }
    }

我有一个单独的模块来为用户分配访问 UI01、UI02、UI03 的权限,如下所示。

    Page name   Admin   Employee  Customer
------------------------------------------------
    Rating      1         0         0
    Map         1         0         0
    Sales       1         0         0

    *1-allow
    *0-Deny access

目前所有三个 UI 都只允许管理员角色。但是我需要使用上述 UI 中设置的权限来动态设置对 Controller 方法的访问。

编辑: 我为每个 Page/actionresult 创建了 Customauthorize 属性,并使用此链接中的方法成功获得了结果 asp.net mvc decorate [Authorize()] with multiple enums

但我现在的问题是隐藏布局(视图)页面中的菜单

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-5 privileges roleprovider custom-membershipprovider


    【解决方案1】:

    目前您将权限分配给“组”用户。使用类似以下的方式将权限分配给各个用户可能会更容易:

    public class HomeController : Controller
    {
        [CustomAuthorize(Roles="Rating")]
        public ActionResult UI01(){
            return View();
        }
    
        [CustomAuthorize(Roles="Map")]
        public ActionResult UI02(){
            return View();
        }
    
        [CustomAuthorize(Roles="Sales")]
        public ActionResult UI03(){
            return View();
        }
    }
    

    用户界面看起来像:

    @*menu items*@
    @if((Roles.IsUserInRole("Rating")){
      <li>@Html.ActionLink("Rating", "UI01", "Home")</li>
    }
    
    @if((Roles.IsUserInRole("Map")){
      <li>@Html.ActionLink("Map", "UI02", "Home")</li>
    }
    
    @if((Roles.IsUserInRole("Sales")){
      <li>@Html.ActionLink("Sales", "UI03", "Home")</li>
    }
    

    然后您可以创建一个管理页面来将角色分配给用户。使用如下代码:

    System.Web.Security.Roles.AddUserToRole("MyUserName", "Rating");
    

    【讨论】:

    • 感谢您的宝贵时间,我不明白。您能否简要介绍一下如何动态获取角色(“评级”)的值?
    • 您可以创建一个管理页面并使用:Roles.AddUserToRole("MyUserName", "Rating");
    • 我有预定义的角色,称为'Admin'、'Employee'和'customer'。目前具有管理员权限的用户可以访问所有用户界面,因为设置了'1'。如果我将 SAles 更改为 '0' ,则可以限制管理员访问权限。
    • 我建议您可以添加新角色(评级、地图和销售)并将这些角色分配给各个用户,但这可能不适合您的需求。如果您想为角色分配权限(例如,给员工评分,那么您必须编写一些自定义代码)。
    • 我想你可以有一个管理页面,循环访问特定角色(例如员工)的所有用户,并为每个用户添加权限(例如评级 - 只是另一个角色)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2017-01-07
    相关资源
    最近更新 更多