身份验证处理程序不阻止请求

Authentication Handler not blocking requests

我已经为我的 API 添加了身份验证,可以使用两种不同的身份验证方案进行身份验证。 基于 Auth header 的格式,我使用 ForwardDefaultSelector.

将身份验证请求转发给适当的身份验证处理程序
 services.AddAuthentication(opt =>
                    {
                        opt.DefaultScheme = "ForwardScheme";
                        opt.DefaultChallengeScheme = "ForwardScheme";
                    })
                    .AddPolicyScheme("ForwardScheme", "ForwardScheme", options =>
                        options.ForwardDefaultSelector = context =>
                            context.Request.IsSchemeA()
                                ? "SchemeA"
                                : "SchemeB")
                    .AddSchemeA()
                    .AddSchemeB();

添加方案:

public static AuthenticationBuilder AddSchemeA(this AuthenticationBuilder builder)
        {
            builder.AddScheme<AuthenticationSchemeOptions, SchemeAHandler>(
                "SchemeA", null);
            return builder;
        }

转发似乎工作正常,我可以根据 header 值看到请求到达正确的身份验证处理程序。

问题是即使身份验证失败,API 调用也没有被阻止,我仍然收到 200 响应。

在 AuthHandler 中,我只是返回这个:

 return AuthenticateResult.Fail("Authentication Failed");

知道我在这里遗漏了什么吗? 谢谢

@EnricoMassone 感谢您为我指明正确的方向。

我的控制器方法缺少 [Authorize] 属性。

您可以在每个方法上单独设置属性,或者您可以执行类似 的操作,这将为您的所有控制器启用对所有方法的授权

如果您为您的应用程序注册身份验证方案并将身份验证中间件添加到 ASP.NET 核心请求管道,您基本上是在请求 ASP.NET 核心框架尝试对任何传入请求进行身份验证, 通过使用指定的身份验证方案。这本身不会将响应状态代码从 200 更改为 401。

为了在匿名请求到达您的服务器时获得 401 响应,您需要对传入请求提出所谓的 authetication challenge

最简单的方法基本上是要求请求主体经过身份验证才能执行特定的操作方法。为此,您只需使用 [Authorize] 属性修饰操作方法。通过这种方式,您可以为操作方法设置执行策略,仅当请求主体经过身份验证时才允许执行该方法。