从 .net 核心网站进行重定向时出现 CORS 问题 api

CORS issues when doing redirection from .net core web api

错误:来自来源 'http://localhost:4200' 的 'http://somedevserver.com/SomePage?id=abc'(从 'https://localhost:44359/api/Verification/signin' 重定向)处的 XMLHttpRequest 访问已被 CORS 策略阻止:响应预检请求未通过访问控制检查:预检请求不允许重定向。

我在验证服务中启用了 CORS 策略,因此来自 localhost:4200 的调用转到 Verification/signin 方法。 Verification/signin 中的逻辑成功创建了 URL http://somedevserver.com/SomePage?id=abc 并尝试执行重定向。

重定向是使用以下代码完成的:

[Route("signin")]
public async Task<ActionResult<ApiResponse>> Signin([FromBody] ApiQuery request)
{
    ApiResponse response = await Mediator.Send(request);
    return RedirectPermanent(response.SomeEndpoint);
}

当我测试 Verification/signin 方法时,重定向在 SoapUI 中成功发生。但是,当我在 Angular 应用程序中集成 Verification/signin 方法时,由于 CORS 问题,重定向失败。

在执行重定向之前,我是否需要在 Verification/signin 方法中设置任何 headers and/or 在 localhost:4200 中执行 Web api 调用时?

somedevserver.com/SomePage?id=abc -> .Net 应用程序

Verification/signin -> .Net Core 5.0 Web Api

localhost:4200 -> Angular 11 个应用

谢谢。

更新 1 通过在 Global.asax.cs -> Application_BeginRequest 方法中添加代码,我设法解决了 pre-flight OPTION 请求问题。现在所有的pre-flight请求都成功了,但是浏览器还是没有重定向。

我可以看到 HTML 出现在 F12 -> 响应选项卡中,但是重定向没有发生。

我需要在return RedirectPermanent(response.SomeEndpoint);

之前添加任何特殊的headers吗

如错误消息中所述:“预检请求不允许重定向”。所以我想你需要将重定向服务器设置为 return 对所有预检请求(请求类型 - “OPTIONS”)的正常响应(200),然后对主请求进行重定向(请求类型不是“选项").

另一种解决方案可能是为本地开发服务器设置代理。 我经常使用它来避免必须 fiddle 与服务器配置。 例如,您的本地服务器是 http://localhost:4200/ 上的 运行,服务器是 http://localhost:8080/ 上的 运行。 基本上,您需要在 Angular 项目的 src/ 文件夹中创建一个“proxy.config.json”文件。

在此文件中,您需要输入类似以下内容:

{  
   "/api": {
     "target": "http://localhost:8080",
     "secure": false
   }
}

然后您可以使用 ng serve --proxy-config proxy.conf.json 开始您的应用程序。见官方documentation or post.

我认为真正的问题是设计使然。服务器重定向不适用于单页应用程序。

据我了解,您有 2 个应用程序:

  • Angular 前端
  • dotnet 核心 api 后端

整个 Angular 应用程序在第一次浏览时加载并在浏览器上运行:每个路由都由客户端管理。联系服务器的唯一方法是通过 apis.

在此上下文中,重定向 api XHR 后台请求不会触发浏览器重定向。

您可以实现您的目标,在后端返回这样的 api http 错误:

401 Unauthorized
{
  "code": 401,
  "message": "Unauthorized",
  "details": "You need to login"
}

您可以使用此处描述的 Angular AuthGuard 管理此“标准”http 错误