【发布时间】:2014-11-12 17:20:58
【问题描述】:
我需要通过循环区域/控制器/操作列表(我动态保存在数据库中)和由管理员分配给用户的操作来创建自定义授权和身份验证用户安全性,这是一个好的解决方案吗? (我需要动态授权和身份验证,而不是动作上的授权标签。我该怎么写?)
【问题讨论】:
标签: asp.net-mvc security action
我需要通过循环区域/控制器/操作列表(我动态保存在数据库中)和由管理员分配给用户的操作来创建自定义授权和身份验证用户安全性,这是一个好的解决方案吗? (我需要动态授权和身份验证,而不是动作上的授权标签。我该怎么写?)
【问题讨论】:
标签: asp.net-mvc security action
MVC 架构的主要卖点之一是将界面(无论是视图甚至 URL)与控制器、操作等的底层架构解耦。您提出的建议并不可怕,但也不理想, 任何一个。如果您需要添加新操作怎么办?如果你需要删除一个动作怎么办。如果您需要将一项行动的职责转移到另一项行动中怎么办。所有这些都会从根本上改变您的权限,需要大量维护。
这是一份更适合角色的工作,而这正是角色存在的意义所在。如果你想控制谁可以编辑一个小部件,你不要让他们显式访问 WidgetArea > WidgetController > EditWidget;你给他们一个CanEditWidget的角色。然后,任何涉及编辑小部件的操作都可以使用该角色进行保护。这不仅允许您继续仅使用 Authorize 属性和 avoi 自定义代码,而且还获得了可移植性。如果底层架构发生变化,您的权限系统不受影响。
【讨论】:
您可能会继承 AuthorizeAttribute 并覆盖 IsAuthorized 方法以实现您的自定义逻辑。然后,您可以将自定义 AuthorizeAttribute 注册为站点范围内的全局过滤器,以实现此行为。
global.asax:
protected void Application_Start()
{
....
RegsterFilterProviders(FilterProviders.Providers);
}
private void RegsterFilterProviders(FilterProviderCollection providers)
{
providers.Add(new CustomAuthorizeAttribute());
}
但是,如果您走这条路,您应该尝试使用某种缓存机制(例如会话状态)来一次加载所有设置,这样您就不会不断地调用数据库来检索您的安全设置。
请注意,实现相同效果的标准方法是使用一组角色,在每个控制器和/或操作上使用允许的角色对 AuthorizeAttribute 进行硬编码,然后使用数据库将用户动态分配给角色.您可以根据需要使这些角色广泛或细化以适合您的用例。这将比您尝试实现的目标更加高效和可维护。
【讨论】: