在 mvc 中实现安全性

Implementing security in mvc

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

那么,我的问题是我们应该选择 ActionFilter 还是 Authorize Filter?最初我们尝试使用 ActionFilter,但是我的动作过滤器被调用了,尽管特定的动作是 NOT executed/called.

动作过滤器

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);
    }
    }

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

  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 attribute would be more appropriate in your case to check the user permissions to allow access to any view. I believe ActionFilter 可能更适合任何记录 before/after 操作执行的情况。
  3. 关于以下

    So, while logging into the application the action filter is getting called. why this is so ?

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

希望这能帮助您找到解决方案!