У меня есть API-шлюз, в данном случае он называется Gateway.Api.В классе Startup
у меня есть следующее:
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
services.AddOcelot(Configuration);
services.AddMvc();
var appSettingSection = Configuration.GetSection("AppSettings");
services.Configure<AppSettings>(appSettingSection);
var appSettings = appSettingSection.Get<AppSettings>();
var key = Encoding.ASCII.GetBytes(appSettings.Secret);
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.SaveToken = true;
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateIssuer = false,
ValidateAudience = false
};
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseAuthentication();
app.UseOcelot().Wait();
app.UseMvc();
}
Как вы можете видеть, он определяет схему аутентификации.
Использование Ocelot
У меня есть следующий файл конфигурации для моего Gateway.Api
:
{
"ReRoutes": [
{
"DownstreamPathTemplate": "/api/customer",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 50366
}
],
"UpstreamPathTemplate": "/api/customer",
"UpstreamHttpMethod": [ "Get" ],
"AuthenticationOptions": {
"AuthenticationProviderKey": "Bearer",
"AllowedScopes": []
}
},
{
"DownstreamPathTemplate": "/api/user/authenticate",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 50353
}
],
"UpstreamPathTemplate": "/api/user/authenticate",
"UpstreamHttpMethod": [ "Post" ]
}
],
"GlobalConfiguration": {
"UseServiceDiscovery": false
}
}
Когда я пытаюсь получить доступ к http://localhost:50333/api/customer (Gateway.Api имеет порт 50333) без токена, я получаю ответ 401, который подтверждает, что файл конфигурации, а такжеаутентификация работает.
Помимо микросервиса Customer, у меня также есть микросервис Identity, который позволяет пользователям проходить аутентификацию, используя действительные имя пользователя и пароль, которые затем выдают токен.Используя этот токен, чтобы затем позвонить в отдел обслуживания клиентов, я получаю успешный ответ (200 OK).
Теперь по какой-то причине, если я обращаюсь в службу поддержки клиентов напрямую без использования шлюза (поэтому http://localhost:50366/api/customer) Я могу получить успешный ответ без токена.
Нижемикросервис клиента:
[Route("api/[controller]")]
public class CustomerController : Controller
{
[HttpGet]
public IEnumerable<string> Get()
{
var customers = new string[] {
"test",
"test"
};
return customers;
}
}
Означает ли это, что я должен добавить схему аутентификации для каждого класса микросервиса Startup
? Если да, разве это не перебор?
Что я сделалtry использует атрибут [Authorize]
для действий в микросервисе Customer, однако это вызывает исключение, что их схема аутентификации по умолчанию отсутствует.