如何将自定义参数传递给授权策略

时间:2019-06-03 02:11:52

标签: asp.net-mvc-4 asp.net-core

我需要在asp.net核心MVC中为我的其余API提供一个自定义属性。我想将此属性可选地添加到一些API中。此属性根据某些条件检查用户是否可以访问该API,如果无法访问,则抛出403。我当时使用过滤器来实现此目的,而过滤器的问题是无论属性是否添加到我的API中,都会执行过滤器代码。 我希望仅在将此属性添加到API时才执行过滤器代码。
我的同事建议我针对此用例使用授权策略,而不要使用过滤器。仅在将策略添加到API后才执行策略。另外,由于我抛出403,因此授权策略是更好的选择。我研究了授权策略,但是我的问题是我无法将自定义属性传递给授权策略。

例如,我能够使用过滤器和自定义属性来做到这一点。

[MyCustomFeature("param1", "param2")]

如何在授权策略中执行相同的操作?我将此示例用于授权策略。 Custom Authorization attribute asp.net core

1 个答案:

答案 0 :(得分:1)

请参见here。强烈建议从上至下阅读。

摘要是,无论您如何接入基于策略的身份验证系统,策略始终通过单个字符串来解析。因此,要获得想要的东西,您需要:

  • 实现一个自定义属性,该属性将AuthorizeAttribute子类化,并接受您传入的参数,并使用它们生成策略名称字符串。仔细阅读链接的文档页面中的“自定义授权属性”示例,查看其如何在策略字符串中实际存储“年龄”的值。
  • 实施并注册一个自定义IAuthorizationPolicyProvider,该IAuthorizationPolicyProvider可以解释由您的自定义属性生成的字符串并即时生成适当的策略。

涉及的代码并不多,而且也不是很复杂,但是归结为将内容放入字符串中有点奇怪/尴尬。