Как сдать JWT для микросервиса и для пользователя - PullRequest
1 голос
/ 21 января 2020

Я работаю над созданием системы, основанной на микросервисной архитектуре. Микроуслуги создаются с использованием Asp. Net Core 3.1.

Упрощенная диаграмма высокого уровня показана ниже:

Simplified high level diagram of the system

Мне нужны два уровня безопасности в системе:

Микросервисная аутентификация

Когда ApiGateway получает запрос, он получает "микросервисный JWT" от InternalAuthService и включает этот JWT в заголовок авторизации при отправке запросов по http другим микросервисам. Этот JWT содержит одно или несколько утверждений, которые используются микросервисами для принятия решения о том, должен ли запрос быть принят или отклонен.

InternalAuthService реализован с использованием IdentityServer, и, похоже, сейчас он работает отлично. Это означает, что CustomerService отклоняет запросы, если ApiGateway не предоставляет JWT с требуемой заявкой.

Аутентификация пользователя

Далее я хочу добавить аутентификацию пользователей, и это где мне нужна твоя помощь. Несколько конечных точек в ApiGateway не требуют аутентификации пользователя (например, регистрация пользователя и логин пользователей). Но многим другим конечным точкам потребуется аутентификация пользователя. Я уверен, что это можно понять, как я делал это в других проектах.

Поскольку в прошлом я использовал IdentityFramework при создании небольших монолитных c приложений, я хотел бы использовать это в эта система также. Вот почему я ввел UserAuthService.

Я хотел бы отклонить запросы в ApiGateway, когда пользователь не предоставляет действительный «пользовательский JWT». Этот JWT также содержит ряд заявок, используемых для ограничения доступа к конечным точкам CustomerService в зависимости от ролей, которые имеет пользователь.

Проблема

При отправке запроса от ApiGateway до CustomerService «микросервис JWT» помещается в заголовок авторизации. JWT аутентифицируется в файле Starup.cs CustomerService следующим образом:

public void ConfigureServices(IServiceCollection services)
        {
            services.AddAuthentication("Bearer")
                    .AddJwtBearer("Bearer", options =>
                    {
                        options.Authority = "https://localhost:44308"; //url pointing to InternalAuthService
                        options.RequireHttpsMetadata = false;
                        options.Audience = "customer_service"; //the claim required by the CustomerService
                    });            
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseRouting();            
            app.UseAuthentication();
            app.UseAuthorization();
            app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
        }

Я хочу настроить аутентификацию "пользовательского JWT" аналогичным образом, но я не могу понять, как это сделать.

Итак, первая проблема заключается в том, где и как я могу сохранить «пользовательский JWT» в запросе, чтобы иметь возможность авторизовать его при получении CustomerService?

Следующая проблема Как я могу настроить аутентификацию "пользователя JWT"?

Я открыт для замены IdentityFrameWork на IdentityServer, если это упрощает работу (но я бы предпочел этого не делать, потому что, как я уже говорил, у меня есть опыт с использованием IdentityFramework).

1 Ответ

0 голосов
/ 23 января 2020

Мое мнение: эта архитектура безопасности сложна. Вы можете достичь двух уровней безопасности, которые вам нужны, используя однократный токен пользователя и авторизацию на основе утверждений.

Если в шлюз выполняется вызов с токеном пользователя, шлюз аутентифицирует вызов на основе токена пользователя, извлекает утверждение userId и вводит его в нисходящий вызов микросервиса. Чтобы это работало, в идеале userId должен быть компонентом на пути работы сервиса.

Итак, URI, предоставляемый на шлюзе для данного ресурса:

GET /resources/{resourceId}

, но на реальной службе отображается как:

GET /resources/{userId}/{resourceId}

Это означает, что нисходящий микросервис может реализовать свои собственные меры для предотвращения доступа. Например, отклоните запрос от кого-либо, кроме владельца запрошенного ресурса, на доступ к ресурсу.

Это показано здесь:

enter image description here

Если изменение пути службы является сложным краткосрочным изменением, то внедрение заявки пользователя может быть выполнено в виде запроса, заголовка или даже параметра тела.

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