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