我们有一个网关,它们执行的认证和呼叫的授权到达之前的API(使用山猫实现)
对于身份验证,网关使用JwtBearer像下面
services.AddAuthentication(Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Events = JwtBeaerEvents();
options.TokenValidationParameters = TokenValidationParameters(tokenConfig);
});
而且,这个正确验证令牌。
除此之外,网关与自定义授权实施,其所使用自定义配置文件读取权限相关的设置。而且,这种自定义的授权添加为中间件
我们试图验证中间件之后加入该授权中间件,像
app.UseAuthentication().UseAuthorizationMiddleware();
这适用于有效的令牌。然而,对于无效的标记,不论身份验证失败得到的呼叫路由到AuthorizationMiddleware为好。而且,基于these发现,貌似我们需要去与DI,而不是中间件。但是,我们要的是授权一个自定义实现与JwtBearer方案沿其接受通过配置文件的权限/政策/范围(网关),而不是在API属性装饰他们。任何人都可以扔在如何达到同样的一些轻?
非常感谢您的帮助
这个问题是由于.NET核心的behaviour。当身份的IsAuthenticated标志是假的,HTTP的StatusCode不是由框架令牌验证失败的情况下,在身份验证期间设置为401,并前进到下一个电话。如果我们使用基于策略的授权,它会被自动RequireAuthenticatedUser(),同时建立授权策略的照顾。然而,由于我们使用的是定制的中间件,介绍彼此中间件它复制DenyAnonymousAuthorizationRequirement做什么,像下面
var user = httpContext.User;
var userIsAnonymous =
user?.Identity == null ||
!user.Identities.Any(i => i.IsAuthenticated);
if (userIsAnonymous)
{
httpContext.Response.StatusCode = 401;
return Task.CompletedTask;
}
return _next(httpContext);
我们把这个中间件中验证和授权中间件之间和问题已解决