如何将自定义参数传递给授权策略
How to pass custom argument to authorization policy
我在 asp.net 核心 MVC 中 API 需要一个自定义属性。我想选择性地将此属性添加到我的某些 API 中。此属性根据某些条件检查 API 是否可供用户访问,如果不可访问则抛出 403。我正在使用过滤器来实现这一点,而过滤器的问题是无论属性是否添加到我的 API,过滤器代码都会被执行。
我希望仅当将此属性添加到 API.
时才执行我的过滤器代码
我的同事建议我应该在这个用例中使用授权策略而不是过滤器。策略仅在添加到 API 时执行。此外,由于我抛出 403,授权策略是更好的选择。我探索了授权策略,但我的问题是我无法将自定义属性传递给授权策略。
例如,我可以使用过滤器和自定义属性来做到这一点。
[MyCustomFeature("param1", "param2")]
如何在授权策略中做同样的事情?我将此示例用于授权策略。
参见here。强烈建议从头到尾阅读。
总结是,无论您如何进入 policy-basd 身份验证系统,策略总是通过单个字符串解析。所以,要得到你想要的,你需要:
- 实现一个自定义属性,它是
AuthorizeAttribute
的子类,它接受您传入的参数并使用它们生成策略名称字符串。仔细阅读链接文档页面中的 "Custom Authorization attributes" 示例,了解它实际上如何将 "Age" 的值存储在策略字符串中。
- 实施并注册自定义 IAuthorizationPolicyProvider,它可以解释自定义属性生成的字符串并动态生成适当的策略。
没有涉及大量代码,也不是很复杂,但是 strange/awkward 归根结底就是将内容放入字符串中。
我在 asp.net 核心 MVC 中 API 需要一个自定义属性。我想选择性地将此属性添加到我的某些 API 中。此属性根据某些条件检查 API 是否可供用户访问,如果不可访问则抛出 403。我正在使用过滤器来实现这一点,而过滤器的问题是无论属性是否添加到我的 API,过滤器代码都会被执行。
我希望仅当将此属性添加到 API.
时才执行我的过滤器代码
我的同事建议我应该在这个用例中使用授权策略而不是过滤器。策略仅在添加到 API 时执行。此外,由于我抛出 403,授权策略是更好的选择。我探索了授权策略,但我的问题是我无法将自定义属性传递给授权策略。
例如,我可以使用过滤器和自定义属性来做到这一点。
[MyCustomFeature("param1", "param2")]
如何在授权策略中做同样的事情?我将此示例用于授权策略。
参见here。强烈建议从头到尾阅读。
总结是,无论您如何进入 policy-basd 身份验证系统,策略总是通过单个字符串解析。所以,要得到你想要的,你需要:
- 实现一个自定义属性,它是
AuthorizeAttribute
的子类,它接受您传入的参数并使用它们生成策略名称字符串。仔细阅读链接文档页面中的 "Custom Authorization attributes" 示例,了解它实际上如何将 "Age" 的值存储在策略字符串中。 - 实施并注册自定义 IAuthorizationPolicyProvider,它可以解释自定义属性生成的字符串并动态生成适当的策略。
没有涉及大量代码,也不是很复杂,但是 strange/awkward 归根结底就是将内容放入字符串中。