当前位置: 首页 > 知识库问答 >
问题:

根据角色权限允许/拒绝用户调用控制器操作的最佳实践

戚同
2023-03-14

我有一个角色系统,管理员可以根据页面菜单(每个页面菜单都有自己的控制器)创建新角色并授予读取、写入、编辑和删除权限,然后将该角色分配给用户。

用户也可以有多个角色,但我已经讨论过了。我面临的唯一问题是:由于角色分配可以在应用程序中动态完成,所以我不能使用< code>[Authorize(Roles = Role。Admin)]属性。

相反,我正在考虑创建[读取],[写入],[编辑]和[删除]属性,我将这些属性放在操作上,让我知道该操作的用途,然后允许或拒绝用户调用该操作。

这是正确的方法吗?我需要在这些自定义属性中包含什么,以及如何允许/拒绝用户调用它们?有没有人有过类似的经历?

假设我拥有Home和Admin controller以及具有以下权限的Role1和Role2:

上述方法是否有效?如何定义控制器操作的自定义访问权限?

我想避免将所有操作都放在数据库中,并简化网站的管理。

通过这种方式,可以在控制器级别而不是角色1上对R/W/E/D标志进行管理。可以对所有Home/Index、Home/GetRecords等进行管理...行动层面。

共有3个答案

充普松
2023-03-14

使用声明。您需要定义的每个公共控制器操作声明。

然后让您的角色由他们可以执行的索赔/操作列表定义。

这里有一个很好的解释,在ASP.NET MVC中,基于角色的访问控制(RBAC)与基于声明的访问控制(CBAC)

桂梓
2023-03-14

我会用不同的方式定义它,只是给每个用户一组角色。

给每个用户定义一个以上的角色,如果某人有写的权限,你为他设置一个写的角色,如果他也能读你可以添加另一个角色-读。

现在,在定义操作时,可以使用以下格式:[Authorize(Roles=Role.Read)]。按所需的访问权限设置每个操作,您就完成了。

双恩
2023-03-14

我对我的项目有同样的要求。在我的项目中,我必须允许用户访问一些页面和一些管理页面。通常管理员可以访问一切,但我不得不阻止用户访问一些页面/动作。我做了以下事情。

a、 创建一个类来验证用户/管理员。

b.为 User 创建一个类,并从“ActionFilterAttribute”继承该类,并重写 OnActionExecuting 方法。

c.为admin创建一个类,做和“b”中提到的一样的事情,但是是为Admin。

d、 根据访问权限,将身份验证类名置于类名或方法之上。

请参阅示例代码(步骤 b)。我删除了一些代码,但你可以得到这个想法。

public class AuthenticateUser : ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext context)
        {
            //Do session check.
            if (HttpContext.Current.Session["Id"] == null || String.IsNullOrEmpty(HttpContext.Current.Session["Id"].ToString()))
            {
                HttpContext.Current.Response.StatusCode = HttpStatusCode.Forbidden.GetHashCode();
                if (filterContext.HttpContext.Request.IsAjaxRequest())
                {
                    filterContext.Result = new JsonResult { Data = new { Status = HttpStatusCode.Forbidden, LogonRequired = true, result = "Session Expired" }, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
                }
                else
                {
                    //redirect to login page
                    UrlHelper oUrl = new UrlHelper(HttpContext.Current.Request.RequestContext);
                    string s = oUrl.Action("", "UserInfo/");
                    HttpContext.Current.Response.Redirect(s);
                }
            }

            //If usertype is User then allow it. If user type is admin then return redirect.

            //Redirect code if admin
            UrlHelper oUrl = new UrlHelper(HttpContext.Current.Request.RequestContext);
            string s = oUrl.Action("", "UserInfo/");
            HttpContext.Current.Response.Redirect(s);

        }
    }
 类似资料:
  • 有些企业会对向用户发送的营销内容进行严格的管理——基层的运营或营销经理拟定的活动必须经过上级管理者的审批,方可生效执行。为此,诸葛的智能触达中提供了基于用户角色的触达活动权限管理,以支撑上述的企业需求。 如果您的团队需要使用权限控制,可通过以下步骤开启使用: 开启权限控制:智能触达的权限控制默认是关闭的,需要开启后方能使用; 分配用户角色:为团队成员分别分配设定「管理员」和「运营人员」角色; 开始

  • 问题内容: 我需要在使用PHP / MySQL构建的Web应用程序中添加用户角色和权限系统。我想要此功能: 一个root用户可以创建子root,组,规则和普通用户(所有特权)。 子根只能为其自己的组(无组)创建规则,权限和用户。 用户可以基于组根分配给他或他的组的权限来访问分配给他或他的组的内容。 我需要系统足够灵活,以便将新角色和权限分配给内容。 我有一个表,用于存储组密钥以及其他信息。目前,我

  • 我创建了新帐户“kim2”,但当我用“kim2”推它时< br >它显示以下错误: 我将全局< code>user.name和全局< code>user.email更改为新的用户ID 我使用HTTPS不SSH。 有什么解决办法吗?

  • 为什么我不能上传到我的桶里?

  • 情境:我在不同的Docker容器中设置了Hive、Hue和Hadoop。在同一个Docker网络中。我为每个hadoopnamenode、2个datanode、1个Hue实例、1个Hive服务器和一个Postgres元存储创建了一个容器。我能够在hdfs站点中配置色调代理用户。namenode的xml,可以通过webhdfs浏览文件系统。但对于Hive,我在色调中得到错误: 例如,我可以在配置单元

  • 环境之间的唯一区别(从Ansible的角度来看)是。/roles/esb/vars/main.yml中保存的信息。 我已经考虑过使用svn为每个环境保留一个vars/main.yml,所以每次需要配置环境时,在运行上面的命令之前,我会检查该环境的角色,然后检查vars/main.yml。 对我来说,不是一个优雅的解决方案。我怎样才能做得更好? ./roles/esb/tasks/main.yml