让我们假设我们正在使用“Abc”架构和相应处理程序的身份验证,一切都很好。我们能够简单地使用
来保护 Controller[Authorize(AuthenticationSchemes = "Abc", Roles = "admin")]
属性
但现在似乎也需要能够使用“Xyz”架构来保护 Controller 的端点(因此请求应符合两种方案的要求)。
所以,我认为注册新的模式和处理程序足以能够按如下方式使用 [Authorize]
并接收 AND
逻辑:
[Authorize(AuthenticationSchemes = "Abc", Roles = "admin")]
[Authorize(AuthenticationSchemes = "Xyz")]
public class UserController : ControllerBase
{
}
但是,对 Controller 的有效请求会导致“禁止” 响应状态(请注意,即使是“未授权”)。
我还发现有趣的是,当我们在操作方法而不是 Controller 上应用 [Authorize(AuthenticationSchemes = "Xyz")]
- 一切都按预期工作。
附注:Startup
中的 MvcOptions.AllowCombiningAuthorizeFilters
已设置为 false
。
我猜测当两个属性出现在同一级别(在本例中为 Controller )时,它仍然以某种方式合并授权逻辑。
有人知道我错过了什么吗? 可能我的想法完全错误,并且有一种适当的方法来进行多模式身份验证 因此,请随时提供您的想法。
最佳答案
我想这可能已经得到了 here 的回答。
当您看到这种情况下的复杂授权属性时,基于策略的授权可以帮助保持事情的可维护性和简单性。
你最终会使用策略是这样的
services.AddAuthorization(options =>
{
options.AddPolicy("MyPolicy", policy =>
{
policy.RequireAuthenticatedUser();
policy.RequireRole("Admin");
policy.AddAuthenticationSchemes("Abc", "Xyz");
});
});
并且您只需装饰您的 Controller 或其任何方法
[Authorize(Policy = "MyPolicy")]
同时查看 official docs 以了解它是如何完成的以及它可以为您提供什么。
关于authentication - 一次使用多个方案授权 ASP.NET Core 2.1 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52423750/