Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 定义一个WebAPI方法,该方法的限制小于其类的授权限制_C#_Asp.net Web Api_Asp.net Web Api2_Authorization - Fatal编程技术网

C# 定义一个WebAPI方法,该方法的限制小于其类的授权限制

C# 定义一个WebAPI方法,该方法的限制小于其类的授权限制,c#,asp.net-web-api,asp.net-web-api2,authorization,C#,Asp.net Web Api,Asp.net Web Api2,Authorization,我希望定义一个ApiController,它有一个[Authorize(Role=“something”)]属性,这样在默认情况下,添加到控制器的任何方法都需要“something”角色,但我想使控制器上的两个方法的限制性比这个小,但不是匿名的。我尝试了以下方法(单独,而不是一次性): 但这些似乎都不起作用,仍然需要登录用户扮演更严格的“某物”角色。我不想更改class-levelAuthorize属性,因为这会使将来添加的方法很容易不安全。据我所知,这是不可能的;我也遇到过同样的问题,我同意这

我希望定义一个ApiController,它有一个
[Authorize(Role=“something”)]
属性,这样在默认情况下,添加到控制器的任何方法都需要“something”角色,但我想使控制器上的两个方法的限制性比这个小,但不是匿名的。我尝试了以下方法(单独,而不是一次性):


但这些似乎都不起作用,仍然需要登录用户扮演更严格的“某物”角色。我不想更改class-level
Authorize
属性,因为这会使将来添加的方法很容易不安全。

据我所知,这是不可能的;我也遇到过同样的问题,我同意这对安全性来说很糟糕。不幸的是,ASP.Net中有很多模式,这使得遵循良好的安全实践变得非常困难——我们所能做的就是保持警惕


你可以考虑把不太安全的方法移到一个完全不同的API控制器中,只是为了在任何时候都允许范围限制的安全声明。

如果你是我,我会看一下控制器的重新设计。你的意思是,这里有一些规则需要应用于所有的方法,但是这里有一些方法不应该有这种默认行为。对我来说,这听起来根本不对,而且由于复杂的规则,很容易出错

在这种情况下,拥有多个控制器是正常的,每个控制器都受到越来越少的限制性行为的控制,甚至是匿名访问级别。匿名方法的一个例子是注册方法,或请求访问方法

这样做可以清楚地知道每个控制器应该遵循什么样的规则,而其他人不必去想发生了什么,也不必通过查看每个方法来尝试制定复杂的规则


您仍然可以坚持某种设计模式,例如,假设您的API是RESTful的,您仍然可以坚持这种设计模式,只需按照我在这里介绍的思路有一些例外。

因此,如果您使用的是.Net Framework(如标签所示,WebAPI 2),请仅对方法?Net core或Full Framework?进行授权,请阅读:@Albertoestrela我已经阅读了很多次MS文档中关于安全性的内容,没有任何一个文档以这种或那种方式解决这个问题,因此我在这里提出问题。虽然我同意这个建议,但我不同意这个建议的基础。出于安全考虑,我绝对不会称之为“糟糕”。如果我们继续添加越来越复杂的异常,那么一切都会变得复杂。良好的安全性不是关于复杂的规则,而是关于简单性和良好的设计。拥有(例如)编辑方法使用编辑权限、创建方法使用创建权限等是良好的安全性。作为安全后备措施,对控制器中的所有操作拥有全面许可将是很强的安全性,但目前的设计是禁止的。对于所有控制器操作,我们要么只有一个权限(对于具有细粒度权限的安全性良好的系统来说,这很糟糕),要么必须针对每个方法编写单独的权限代码(这很好,但缺少回退功能会使我们可能忘记某个权限并将该方法公开给公众访问).但这不可能发生,因为您对所有端点都进行了集成测试,对吗?这是框架本身存在安全问题的可怕借口。如果你不得不依赖完美的测试覆盖率,那么你就失败了。我坚持我的声明。目前设计的安全属性系统在默认情况下是不安全的,希望我已经清楚地解释了为什么我认为是这样。
[Authorize(Role="*")]
[Authorize(Role="Any")]
[Authorize(Role="")]
[Authorize]
[Authorize(Users="*", Roles="")]