0

在我的 ASP.NET Core 3.1 - Angular 9 Web 应用程序中,这是我的管道:

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");
                }
            });
        }
    );
}

角度前端将使用身份验证令牌来授权对各种路由的访问,这些都正常工作。

问题:我的后端控制器使用标准的“ api/{controller}/{action}”路径,从某种意义上说,如果将 api 调用直接键入浏览器 URL 地址栏,它将立即返回 401 错误而不执行端点,因此它们受到了适当的保护。但我想要做的是重定向到具有登录部分的主页。我已经搜索并尝试了很多方法,无法让它发挥作用。

我的 Angular 前端有一个检测 401/403 错误的拦截器,但如果它来自直接输入浏览器地址栏的 api 端点路径,它不会拦截。

我还尝试在“api ...”路径上使用身份验证保护,但它没有击中它,因为 SPA 路径是为何时定义的

!httpContext.Request.Path.Value.StartsWith("/api")

在后端,显然这些 api 端点已经通过管道受到保护,我在任何一个或中间件中UseAuthentication()都看不到可以配置重定向的方法。UseRoutingUseEndpoints

因此,当直接在浏览器的 URL 地址栏中键入 api 调用时,我对如何处理重定向感到迷茫。

(附带说明:在运行时似乎无法调试/单步执行 http 管道,例如在调用每个 api 端点时,这对于理解进程非常有用)。

4

1 回答 1

0

直接从url调用api会报401错误。您可以使用 Swashbuckle 来避免该问题。这是一个链接:

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

于 2021-11-11T17:01:12.900 回答