我想要定义一个具有[Authorize(Role="something")]
属性的ApiController,以便默认情况下添加到控制器的任何方法都需要“某事”角色,但我想让控制器上的一些方法比这更少限制,但不是匿名的。我尝试了以下(单独,不是一次全部):
[Authorize(Role="*")]
[Authorize(Role="Any")]
[Authorize(Role="")]
[Authorize]
[Authorize(Users="*", Roles="")]
但这些似乎都不起作用,仍然要求登录用户具有更具限制性的“某事”角色。我不想更改类级别的Authorize
属性,因为这将使得将来添加的方法容易得不到正确的保护。
据我所知,这是不可能的;我遇到了同样的问题并且认为它对安全性很糟糕。不幸的是,ASP.Net中存在很多模式,这使得实际上很难遵循良好的安全实践 - 所有人都能做到的是保持警惕。
你可以考虑将你不太安全的方法转移到一个完全不同的API控制器,只是为了在任何时候允许类范围内的安全声明具有最严格的强度。
如果我是你,我会看看控制器的重新设计。你所说的基本上是一些需要应用于所有方法的规则,但是这里有一些不应该有这种默认行为的方法。这对我来说听起来不对,并且由于复杂的规则而容易出错。
在这种情况下,通常有多个控制器是正常的,每个控制器由越来越少的限制性行为控制,甚至是匿名访问级别。匿名方法的一个示例是Register方法或Request Access方法。
这样做可以清楚地表明每个控制器应该遵循什么样的规则,而其他人不必怀疑发生了什么,并试图通过查看每一种方法来制定复杂的规则。
您仍然可以遵循某种设计模式,假设您的API是RESTful,例如,您仍然坚持这一点,只是有一些例外,就像我在这里展示的那样。