Asp.net web api 在Web API/OWIN中使用大量声明的最佳实践

Asp.net web api 在Web API/OWIN中使用大量声明的最佳实践,asp.net-web-api,owin,claims-based-identity,thinktecture-ident-server,Asp.net Web Api,Owin,Claims Based Identity,Thinktecture Ident Server,我正在尝试使用webapi/OWIN/OAuth实现一个基于声明的授权设置,并试图找到管理更细粒度授权类型的最佳方法 我不喜欢只使用角色的想法,因为我正在处理的应用程序中需要大量细粒度授权。我认为角色+权限方法更有意义(角色只是映射到权限的子集)。权限将基于操作+资源对(例如CanViewEmployee、CanedEmployee等)。这里没有什么不寻常的事 然而,我想知道应该如何使用OWIN/OAuth实现这一点,可能还需要使用ThinktectureIdentityServer。我试图避免

我正在尝试使用webapi/OWIN/OAuth实现一个基于声明的授权设置,并试图找到管理更细粒度授权类型的最佳方法

我不喜欢只使用角色的想法,因为我正在处理的应用程序中需要大量细粒度授权。我认为角色+权限方法更有意义(角色只是映射到权限的子集)。权限将基于操作+资源对(例如CanViewEmployee、CanedEmployee等)。这里没有什么不寻常的事

然而,我想知道应该如何使用OWIN/OAuth实现这一点,可能还需要使用ThinktectureIdentityServer。我试图避免在自定义授权管理器中硬编码权限,因为它们需要在不重建的情况下轻松更改。我知道可以选择将这些作为策略放在web.config中(将资源+操作映射到声明类型和值),但如果我们谈论几十个,甚至数百个权限,这似乎也会很快失控

我想第三种选择是从数据库中驱动它,但是从数据库中管理它也需要某种前端来完成,这比仅仅更改一个config/XML文件要费力得多


当涉及到大量的声明/权限时,我是否遗漏了一些其他选项/最佳实践,或者当数量失控时,我可能会使用一些其他实用程序或包来帮助管理这些内容?

将这些权限分离到一个单独的授权管理器类中是一个很好的第一步。在该代码中,您可以硬编码权限规则(例如“管理员”角色可以执行操作X、Y和Z,但只有“经理”角色可以执行X或Y)。但您也可以让授权管理器中的代码执行动态查找,以检查已在数据库中设置的权限(例如)

在代码中这样做的另一个好处是,您可以对其进行单元测试,以证明您的权限逻辑得到了正确的实现(因此在运行时将得到正确的实施)。如果您的权限经常更改,这将非常有用


此外,如果您需要频繁地重新部署(因为频繁的更改),解耦也会有所帮助,因为代码可以隔离到自己的程序集中

是的,我理解这一点,但我正试图弄清楚这是否是管理大量权限的最佳方式。我希望避免在代码中这样做,以避免在权限(不可避免地)更改时发生代码搅动和重建,并避免有数百行带有规则的代码,因此我一直倾向于在DB中这样做,以便我们可以通过管理屏幕动态地更改它们。我只是想确保我没有遗漏什么,也没有更好的选择。更新增加了单元测试和隔离的好处,以便频繁更新。至于权限频繁变化——很难说。也许这些应该是DB中的标志,而不是代码中的标志。是的,我当然更倾向于DB。谢谢你的信息!