authentication - 一次使用多个方案授权 ASP.NET Core 2.1 Controller

标签 authentication asp.net-core-2.1 authorize-attribute multiple-schema

让我们假设我们正在使用“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/

相关文章:

php - 登录脚本未执行 - Bluehost

iphone - 在 iPhone 上使用 HTTP 摘要式身份验证

java - 正确的 HttpClient 4.3.x 中的基本身份验证

jquery - Ajax 授权失败

asp.net - 从 Owin WebApi2 返回描述性 401 消息

react-native - AWS 放大 : How to resend code when Auth 'signIn' API returns 'UserNotConfirmedException'

asp.net-core - 在 ASP.NET Core 的 URL 查询中使用破折号

c# - 一个实体上的多个属性需要多对多关系 EF Core 2.2

linux - 尝试在 Ubuntu 上运行 .net Core HelloWorld 控制台应用程序

c# - ASP.NET MVC 4 用户身份验证