Аутентификация JwtBearer с пользовательской авторизацией в .net core 2.1 - PullRequest
0 голосов
/ 04 февраля 2019

У нас есть шлюз (реализованный с использованием 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.Может ли кто-нибудь пролить свет на то, как этого добиться?

Ваша помощь очень ценится

1 Ответ

0 голосов
/ 06 февраля 2019

Проблема связана с поведением ядра .net.Когда флаг IsAuthenticated Identity имеет значение 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);

Мы поместили это промежуточное ПО между промежуточными программами аутентификации и авторизации и проблемойбыла решена

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...