Я работаю над созданием системы, основанной на микросервисной архитектуре. Микроуслуги создаются с использованием Asp. Net Core 3.1.
Упрощенная диаграмма высокого уровня показана ниже:
Мне нужны два уровня безопасности в системе:
Микросервисная аутентификация
Когда 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).