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



我在API中添加了身份验证,可以使用两种不同的身份验证方案进行身份验证。基于Auth报头的格式,我使用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;
}

转发似乎工作得很好,我可以看到基于头值的请求到达正确的身份验证处理程序。

问题是,即使auth失败,API调用也不会被阻止,我仍然得到200的响应。

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

return AuthenticateResult.Fail("Authentication Failed");

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

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

当一个匿名请求到达您的服务器时,为了获得401响应,您需要向传入请求发出一个所谓的authetication challenge

最简单的方法基本上是要求对请求主体进行身份验证,以便执行某个操作方法。要做到这一点,您只需要使用[Authorize]属性来修饰操作方法。通过这种方式,您可以为操作方法设置执行策略,该策略只允许在请求主体经过身份验证的情况下执行方法。

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

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

你可以在每个方法上单独设置属性,也可以这样做,它将为你的所有控制器启用所有方法的授权

最新更新