[英]JwtBearer Authentication with Custom Authorization in .net core 2.1
我们有一个网关(使用Ocelot实现),该网关在到达API之前执行调用的身份验证和授权
对于身份验证,网关使用JwtBearer,如下所示
services.AddAuthentication(Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Events = JwtBeaerEvents();
options.TokenValidationParameters = TokenValidationParameters(tokenConfig);
});
并且,这可以正确验证令牌。
除此之外,网关还通过“自定义授权”实现,并使用自定义配置文件向其读取与权限相关的设置。 并且,此自定义授权被添加为中间件
我们尝试在身份验证中间件之后添加此授权中间件,例如
app.UseAuthentication().UseAuthorizationMiddleware();
这适用于有效令牌。 但是,对于无效的令牌,无论身份验证失败如何,该调用也将路由到AuthorizationMiddleware。 而且,基于这些发现,看来我们需要使用DI而不是中间件。 但是,我们想要的是一个授权的自定义实现,该实现通过配置文件(在网关中)与JwtBearer方案一起接受权限/策略/范围,而不是在API属性中进行修饰。 任何人都可以阐明如何实现相同目标吗?
非常感谢您的帮助
该问题是由于.net core的行为所致。 当Identity的IsAuthenticated标志为false时,如果在身份验证期间令牌验证失败的情况下,框架不会将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);
我们将此中间件放置在Authentication&Authorization中间件之间,此问题已解决
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.