【发布时间】: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