JwtBearer认证与自定义授权在.NET 2.1的核心

问题描述 投票:0回答:1

我们有一个网关,它们执行的认证和呼叫的授权到达之前的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属性装饰他们。任何人都可以扔在如何达到同样的一些轻?

非常感谢您的帮助

c# authentication authorization asp.net-core-2.1 asp.net-core-middleware
1个回答
0
投票

这个问题是由于.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);

我们把这个中间件中验证和授权中间件之间和问题已解决

© www.soinside.com 2019 - 2024. All rights reserved.