在 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);
}
}
无论我们传递给过滤器的权限是什么,都会检查用户是否拥有权限。此外,我们正在尝试将会话服务注入过滤器,但会话为空。
我不确定你的用例是否能通过 SessionServices
过滤属性构造函数的实例,但这是不可能的
Attribute
调用的参数应该是 编译时常量
值。
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
数据,以检查所需的权限。
- 理想情况下 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 操作执行的情况。
关于以下
So, while logging into the application the action filter is getting called. why this is so ?
- 请检查您的应用程序代码中的 Filter Registration。理想情况下,如果过滤器应用于任何特定操作(例如
CourseDetails
在您的情况下),那么它只会在该特定操作执行时被调用。
- 或者,请在您的问题中包含 登录 操作,以便我们检查是否存在问题。
希望这能帮助您找到解决方案!
我们正在尝试使用我们预定义的一组权限来实现安全性,这将用于是否执行操作方法、显示或不显示视图、隐藏特定控件(如按钮、文本框等)等。因此,当用户登录到应用程序时,我们拥有用户角色的数据和权限。
那么,我的问题是我们应该选择 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);
}
}
无论我们传递给过滤器的权限是什么,都会检查用户是否拥有权限。此外,我们正在尝试将会话服务注入过滤器,但会话为空。
我不确定你的用例是否能通过
SessionServices
过滤属性构造函数的实例,但这是不可能的Attribute
调用的参数应该是 编译时常量 值。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
数据,以检查所需的权限。- 理想情况下 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 操作执行的情况。
关于以下
So, while logging into the application the action filter is getting called. why this is so ?
- 请检查您的应用程序代码中的 Filter Registration。理想情况下,如果过滤器应用于任何特定操作(例如
CourseDetails
在您的情况下),那么它只会在该特定操作执行时被调用。 - 或者,请在您的问题中包含 登录 操作,以便我们检查是否存在问题。
- 请检查您的应用程序代码中的 Filter Registration。理想情况下,如果过滤器应用于任何特定操作(例如
希望这能帮助您找到解决方案!