【问题标题】:Implementing security in mvc在 mvc 中实现安全性
【发布时间】:2017-08-11 07:06:31
【问题描述】:

我们正在尝试使用我们预定义的一组权限来实现安全性,这将用于执行操作方法、显示或不显示视图、隐藏特定控件(如按钮、文本框等)等。所以,当用户登录到应用程序,我们拥有用户角色和权限的数据。

所以,我的问题是我们应该选择ActionFilter 还是Authorize Filter?最初我们尝试使用 ActionFilter,但我的操作过滤器被调用,尽管特定操作执行/调用。

动作过滤器

using Microsoft.AspNetCore.Mvc.Filters;

namespace LMS.Web.Core.Classes
{
    public class SecurityFilter : ActionFilterAttribute
    {
        private string permissionName;
        private Permissions permissions;

        public SecurityFilter(string m_permissionName)
        {
           permissionName = m_permissionName;
        }

        public override void OnActionExecuted(ActionExecutedContext context)
        {
            base.OnActionExecuted(context);
        }

        public override void OnActionExecuting(ActionExecutingContext context)
        {
            base.OnActionExecuting(context);
        }
    }
}

我在一个动作方法中提到了这个动作过滤器

 [Route("Course/Info")]
 [SecurityFilter("some permission name")]

 public ActionResult CourseDetails()
 {
    return View();
 }

因此,在登录应用程序时,会调用操作过滤器。为什么会这样?

我们想在视图和控制器端使用过滤器。 所以,基本上我们看起来是这样的

 [Route("Course/Info")]
 [SecurityFilter(PermissionName = "some permission")]

 public ActionResult CourseDetails()
 {
    return View();
 }

public class SecurityFilter : ActionFilterAttribute
    {

        public string PermissionName { get; set; }
        public SecurityFilter(SessionServices _session)
        {
            session = _session;
        }
        public SecurityFilter()
        {
          //Unable able to remove the default constructor
         // because of compilation error while using the 
         // attribute in my controller
        }
public override void OnActionExecuting(ActionExecutingContext context)
    {

        if (session.GetSession<List<OrganizationUserRolePermission>>("OrganizationUserRolePermission") != null)
        {
           List<OrganizationUserRolePermission> permissionList = session.GetSession<List<OrganizationUserRolePermission>>("OrganizationUserRolePermission");
     checkPermission = permissionList.Any(m => m.PermissionName == PermissionName);
if(!checkPermission)
{
  // Redirect to unauthorized access page/error page
}
        }

        base.OnActionExecuting(context);
    }
    }

无论我们传递给过滤器的权限如何,都会检查用户是否具有权限。此外,我们正在尝试将会话服务注入过滤器,但会话为空。

【问题讨论】:

  • 你是什么意思“实施安全”?
  • @JohnWu 我已经更新了问题
  • 你有从某处检索用户权限的代码吗?您的网站如何知道它们是什么?
  • 是的,在登录应用程序时,我们检查了用户角色以及分配给用户的权限,我们将该信息保存在一个会话变量中的列表中。我们已经确定了权限的命名约定,例如course.courselist.show,其中course 是主要实体/控制器,courselist 是操作方法

标签: c# asp.net-mvc asp.net-core asp.net-core-mvc custom-attributes


【解决方案1】:
  1. 我不确定您的用例是否可以通过 SessionServices 过滤属性构造函数的实例,但 这是不可能的 Attribute 调用的参数应该是一个编译时常量 价值。

    Reference

    Attribute parameters are restricted to constant values of the following types:
    
     - Simple types (bool, byte, char, short, int, long, float, and double)
     - string
     - System.Type
     - enums
     - object (The argument to an attribute parameter of type object must be
       a constant value of one of the above types.)
     - One-dimensional arrays of any of the above types
    

    您可以直接在OnActionExecuting 方法中检索存储的session 数据以检查所需的权限。

  2. 理想情况下,Authorize 属性更适合您检查用户权限以允许访问任何视图。我相信ActionFilter 可能更适合在操作执行之前/之后进行任何日志记录。
  3. 关于以下

    因此,在登录应用程序时,会调用操作过滤器。为什么会这样?

    1. 请检查您的应用程序代码中的Filter Registration。理想情况下,如果过滤器应用于任何特定操作(例如,在您的情况下为 CourseDetails),那么它将仅在该特定操作执行时被调用。
    2. 或者,请在您的问题中包含 Login 操作,以便我们检查是否存在问题。

我希望这将有助于您找到解决方案!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    相关资源
    最近更新 更多