我在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]
属性。
你可以在每个方法上单独设置属性,也可以这样做,它将为你的所有控制器启用所有方法的授权