在我的 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()
都看不到可以配置重定向的方法。UseRouting
UseEndpoints
因此,当直接在浏览器的 URL 地址栏中键入 api 调用时,我对如何处理重定向感到迷茫。
(附带说明:在运行时似乎无法调试/单步执行 http 管道,例如在调用每个 api 端点时,这对于理解进程非常有用)。