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

是否有更好的方法在ASP中实现基于角色的访问。NET框架?

穆景辉
2023-03-14

基本上,我已经花了几天的时间试图找出如何在我为朋友开发的网站上添加简单的管理员和成员角色。(我正在使用ASP.NET Framework 5.2.7.0)。我知道Microsoft内置了一个很好的基于角色的访问功能,它允许您在控制器的顶部放置类似于[Authorize role=(“Admin”)的内容;但是我根本无法让它工作,我找到的大多数资源都是用于ASP.NET Core的。

我试着修改我的网页。配置文件以启用基于角色的访问(并希望将角色等迁移到我的数据库)。但由于我一直无法解决这些问题,我试着走一条更黑的路线。(**我不是一名高级程序员,我已经做了大约一年了,我绝不是一名专业人士)。这就是我在尝试验证用户是否是管理员时基本上想到的(这也不起作用)。

 [Authorize]
    public class AdminController : Controller
    {
        private LDSXpressContext db = new LDSXpressContext();

        public ActionResult AdminPortal()
        {
            IsAdmin();
            return View();
        }

        private ActionResult IsAdmin()
        {
            string name = User.Identity.Name;
            //The User.Identity.Name stores the user email when logged in
            var currentUserObject = db.accounts.Where(x => x.clientEmail == name);

            Account currentUser = new Account();
            foreach (var user in currentUserObject)
            {
                //I loop through the results, even though only one user should 
                //be stored in the var CurrentUserObject because it's the only 
                //way I know how to assign it to an object and get its values.
                currentUser = user;
            }

            if (currentUser.role == 2) //the number 2 indicates admin in my db
            {
                return null;
            }
            else
            {
           //Even when this is hit, it just goes back and returns the 
           //AdminPortal view
                return RedirectToAction("Index", "Home");
            }
        }
    }

现在我几乎可以肯定,这不是一种非常安全的检查登录用户是否是管理员的方法,但我希望它至少能起作用。我的想法是,当有人试图访问AdminPortal时,IsAdmin方法将运行并检查用户是否是数据库中的管理员。如果是,则返回null并显示AdminPortal视图;如果不是管理员,则重定向到主页上的索引视图。但是,AdminPortal页面总是向任何用户显示,这似乎也不起作用。我甚至走进了代码,看着它在return RedirectToAction(“Index”,“Home”)上运行 操作,但随后它跳回AdminPortal方法并仅返回AdminPortal视图。所以我的问题是:

1) 如果有人碰巧有ASP中基于角色访问的经验。NET框架,我想知道一些如何设置它的技巧

2) 如果其他方法都失败了,我需要使用我的hacky方法,为什么即使用户不是管理员,它仍会继续返回AdminView。

**注意:我知道如果用户是否是管理员,我可以创建一个返回true或false的函数,然后在AdminPortal控制器中有一个if/else语句,该语句在查看时返回true,在查看时返回false,但是我不想在每个ActionMethod上都实现它,最好只保留一行,或者,如果可能,只需在控制器上方的[Authorize Role=“Admin]

非常感谢你们提供的任何帮助,几天来我一直在努力研究和解决这个问题,并决定联系社区!


共有1个答案

葛永丰
2023-03-14

至少,您需要对您正在做的事情进行一些调整:

[Authorize]
public class AdminController : Controller
{
    public ActionResult AdminPortal()
    {
        if(IsAdmin())
        {
            return View();
        }

        return RedirectToAction("Index", "Home");
    }

    private bool IsAdmin()
    {
        bool isAdmin = false;

        using(LDSXpressContext db = new LDSXpressContext())
        {
            string name = User.Identity.Name;

            //The User.Identity.Name stores the user email when logged in

            // @see https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.singleordefault
            var currentUser = db.accounts.SingleOrDefault(x => x.clientEmail.Equals(name, StringComparison.OrdinalIgnoreCase));

            // If the email doesn't match a user, currentUser will be null
            if (currentUser != null) 
            {
                //the number 2 indicates admin in my db
                isAdmin = currentUser.role == 2;
            }
        }

        return isAdmin;
    }
}

首先,DbContext实例最多用于HTTP请求的每个生存期。将其从类/控制器级别移动并放置在using块中,可以确保它被正确地处理。

接下来,您的IsAdmin函数实际上只需要根据您的查找返回一个true/false值,然后AdminPortal操作可以决定如何处理该结果。

由于电子邮件似乎是表中唯一的字段,请使用SingleOrDefault或FirstOrDefault LINQ扩展来获取单个匹配记录。使用哪一个取决于您自己,但如果它确实是唯一的值,SingleOrDefault更有意义(如果多行匹配,它将抛出异常)。将StringComparison标志与字符串一起使用。Equals扩展方法使搜索不区分大小写。这里有一些特定于文化的版本,但我通常会使用顺序匹配。

对于这里的答案来说,实现某个版本的身份框架有点太长了,但是可以实现基于声明的身份验证方案,而无需做太多工作。不过,这可能需要一个单独的答案。

 类似资料:
  • 我是Spring-Boot的新手。我想创建一个API,它将具有基于角色的访问权限和基于JWT令牌的身份验证。但是,无法实现。 我没有使用JPA 安全配置 控制器 授权过滤器 在这种情况下,除了具有主管角色的用户之外,不应访问api/username。

  • 我知道在基于角色的访问控制系统(RBAC)中,组织内的角色由角色表示。然后,每个角色都包含不同的任务(访问权限),以便在应用程序中执行操作。然后,根据其工作职责,为组织中的每个用户分配一个或多个角色。 我不明白的是RBAC中是否存在组。我目前正在设计一个系统,用户可以被分配一个或多个角色。然后,用户可以被放入1个或多个组(例如,程序员、12楼的人、穿金属t恤的人、国际象棋俱乐部的成员等),但这些组

  • 问题内容: 是否可以使用任何基于角色的开源访问控制系统? 问题答案: 布兰登·萨维奇(Brandon Savage)在他的PHP软件包“ ApplicationACL ” 上做了一个演示,该演示可能会或可能不会完成基于角色的访问。PHPGACL可能也能正常工作,但是我不能肯定地告诉您。 但是,我可以告诉您的是Zend Framework 的Zend_ACL组件将执行基于角色的设置(但是您必须子类化

  • 角色定义 [role_definition] 是RBAC角色继承关系的定义。 Casbin 支持 RBAC 系统的多个实例, 例如, 用户可以具有角色及其继承关系, 资源也可以具有角色及其继承关系。 这两个 RBAC 系统不会互相干扰。 此部分是可选的。 如果在模型中不使用 RBAC 角色, 则省略此部分。 [role_definition] g = _, _ g2 = _, _ 上述角色定义表

  • 使用CBAC和RBAC的主要好处是什么?什么时候使用CBAC更好,什么时候使用RBAC更好? 我试图理解CBAC模型的一般概念,但总体思路对我来说仍然不清楚。

  • 以下内容是 xingzhou 对 kubernetes 官方文档的翻译,原文地址 https://k8smeetup.github.io/docs/admin/authorization/rbac/ 基于角色的访问控制(Role-Based Access Control, 即”RBAC”)使用”rbac.authorization.k8s.io” API Group实现授权决策,允许管理员通过Ku