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

use*_*911 0 asp.net-mvc-4 asp.net-core

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

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

[MyCustomFeature("param1", "param2")]
Run Code Online (Sandbox Code Playgroud)

我如何在授权策略中做同样的事情?我将此示例用于授权策略。 自定义授权属性asp.net core

nla*_*ker 5

这里。强烈建议从上到下阅读。

总而言之,无论您如何进入基于策略的身份验证系统,策略始终通过单个字符串来解析。因此,为了得到你想要的,你需要:

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

涉及的代码并不多,也不是超级复杂,但归结为将东西放入字符串中有点奇怪/尴尬。