从 .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 错误
错误:来自来源 '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);
如错误消息中所述:“预检请求不允许重定向”。所以我想你需要将重定向服务器设置为 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
我认为真正的问题是设计使然。服务器重定向不适用于单页应用程序。
据我了解,您有 2 个应用程序:
- Angular 前端
- dotnet 核心 api 后端
整个 Angular 应用程序在第一次浏览时加载并在浏览器上运行:每个路由都由客户端管理。联系服务器的唯一方法是通过 apis.
在此上下文中,重定向 api XHR 后台请求不会触发浏览器重定向。
您可以实现您的目标,在后端返回这样的 api http 错误:
401 Unauthorized
{
"code": 401,
"message": "Unauthorized",
"details": "You need to login"
}
您可以使用此处描述的 Angular AuthGuard 管理此“标准”http 错误