即使使用了EnableCors属性,.NET 5的CORS动作调用仍然被锁定

3
我有一个启用了CORS的控制器。
[EnableCors(Startup.CORS_POLICY_EXTERNAL)]
public class MasterController : Controller
{
    [HttpGet]
    public IActionResult TestaConnessione()
    {
        return Ok();
    }
}

只需进行简单的获取操作:

fetch("url/MasterController/TestaConnessione")

调用方获取 header CORS “Access-Control-Allow-Origin” missing

但如果调用方使用 iframe,则一切正常:

<iframe name="ifrReport" id="ifrReport"></iframe>

<script type="text/javascript">
    (function () {
        let form, input;
        form = document.createElement("form");
        form.action = "URL";
        form.target = "ifrReport";
        form.method = "POST";       
        document.body.appendChild(form);
        form.submit();
    })();

</script>

这是启动配置:

public const string CORS_POLICY_EXTERNAL = "CORS_POLICY_EXTERNAL";
        public const string CORS_POLICY_LOCAL = "CORS_POLICY_LOCAL";
    services.AddCors(options =>
                {
                    options.AddPolicy(name: CORS_POLICY_EXTERNAL,
                                      builder =>
                                      {
                                          builder.AllowAnyOrigin()
                                          .AllowAnyMethod()
                                          .AllowAnyHeader();
    
                                      });
                    options.AddPolicy(name: CORS_POLICY_LOCAL,
                                      builder =>
                                      {
                                          builder.WithOrigins("http://localhost")
                                          .AllowAnyMethod()
                                          .AllowAnyHeader();
    
                                      });
                });
    
    app.UseRouting();
    
                app.UseCors();
    
                app.UseAuthentication();
                app.UseMiddleware<AuthenticationMiddleware>();
                var options = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
                app.UseRequestLocalization(options.Value);
                app.UseAuthorization();

使用浏览器的开发者工具来分析预检请求和响应。这样就可以让你开始了。 - Lex Li
甚至在标志页中查看,在我的 Chrome 浏览器中,CORS 可见性不再存在。 - gt.guybrush
Chrome 不是这个世界上唯一的网络浏览器。 - Lex Li
在我的公司电脑上,它是:( - gt.guybrush
也许这就是原因:我正在使用fetch("url")进行测试,并阅读https://dev59.com/gLTna4cB1Zd3GeqPBNuO 我正在使用jQuery.get(url);来触发我的CORS请求 这将触发一个简单的请求,没有预检OPTIONS请求。 您还没有满足触发预检所需的任何条件。 由于没有进行预检,因此在开发人员工具中不会显示任何内容。 - gt.guybrush
显示剩余4条评论
2个回答

0

0

正如多次回答的那样,你不能仅从客户端 (即你的一方) 绕过 CORS,这个功能也需要在目标服务器上启用。引用自 this answer 的话:

响应的头部,即使是 200OK,也不允许其他来源(域名、端口)访问资源。 如果您是域名的所有者,则可以解决此问题。

当你举例使用 js 脚本将表单附加到文档并提交时,与 CORS 无关,因为在这种情况下,没有进行 AJAX/XHR 请求,而是表单提交操作,可以使用任何域名,而不受其 CORS 策略的限制(尽管还存在其他措施,可能会阻止来自其他域的表单提交,但这不是这个问题的范围)。

作为解决方案,您可以尝试从客户端触发对应用程序后端的请求,该请求将向目标域发出请求,然后您的后端应用程序将该结果提供回客户端。这样,您就不必担心 CORS 策略了。


也许我漏掉了什么,但控制器和启动与跨域策略都在服务器端:这是其他客户端应用程序必须调用的操作。 - gt.guybrush

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接