#angular #asp.net-core-3.1 #http-pipelining
#angular #asp.net-core-3.1 #http-конвейерная обработка
Вопрос:
В моем ASP.NET Ядро 3.1 — веб-приложение Angular 9, это мой конвейер:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseExceptionHandler(GlobalExceptions.WebApiExceptionHandler(
exposeExceptionDetailsToHttp: env.IsDevelopment() || env.EnvironmentName == DssEnvironment.AutomatedTesting,
logger: Serilog.Log.Logger
));
if (!(env.IsDevelopment())
{
app.UseHsts();
}
app.UseRouting();
app.UseAuthentication();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseSpaStaticFiles();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller}/{action=Index}/{id?}");
endpoints.MapRazorPages();
});
app.UseWhen(
httpContext => !httpContext.Request.Path.Value.StartsWith("/api"),
appBranch =>
{
appBranch.UseSpa(spa =>
{
spa.Options.SourcePath = "ClientApp";
spa.Options.StartupTimeout = new TimeSpan(0, 5, 0);
if (env.IsDevelopment())
{
spa.UseAngularCliServer(npmScript: "start");
}
});
}
);
}
Интерфейс angular будет использовать токен аутентификации для авторизации доступа к различным маршрутам, все они работают правильно.
Проблема: мои серверные контроллеры используют стандартный « api/{controller}/{action}
путь», они должным образом защищены в том смысле, что если ввести вызов API непосредственно в адресную строку URL-адреса браузера, он немедленно вернется с ошибкой 401 без выполнения конечной точки. Но то, что я хочу сделать, это перенаправить на главную страницу, на которой есть раздел входа в систему. Я искал и экспериментировал множеством способов, но не смог заставить его работать.
В моем интерфейсе angular есть перехватчик, который обнаруживает ошибку 401/403, но он не перехватывает, если это путь к конечной точке api, который вводится непосредственно в адресную строку браузера.
Я также пытался использовать защиту аутентификации для пути «api …», но он не попадает в него, поскольку путь SPA определен для того, когда
!httpContext.Request.Path.Value.StartsWith("/api")
очевидно, что на серверной части эти конечные точки API уже защищены через конвейер UseAuthentication()
, и я не вижу способа ни в одном UseRouting
, ни UseEndpoints
в промежуточном программном обеспечении, где я мог бы настроить перенаправление.
Итак, я действительно не понимаю, как обрабатывать перенаправление, когда вызов api вводится непосредственно в адресную строку URL-адреса браузера.
(в качестве дополнительного примечания: не похоже, что http-конвейер можно отлаживать / проходить во время выполнения, например, при вызове каждой конечной точки api, что было бы здорово для понимания процессов).
Ответ №1:
Вы получите ошибку 401 при прямом вызове api из url. Вы можете использовать Swashbuckle, чтобы избежать проблемы. Вот ссылка: