ASP.NET Ядро 3.1 и Angular : перенаправление вызова API на страницу входа в систему

#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, чтобы избежать проблемы. Вот ссылка:

https://learn.microsoft.com/en-us/aspnet/core/tutorials/getting-started-with-swashbuckle?view=aspnetcore-6.0amp;tabs=visual-studio