.Net core2 CORS - SetIsOriginAllowed 如何工作?

Rig*_*iga 5 cors asp.net-core

希望允许从不同站点访问我的 API。为此有:

services
    .AddCors(options =>
    {
        options.AddPolicy(PolicyName, builder =>
        {
            builder
                .SetIsOriginAllowedToAllowWildcardSubdomains()
                .WithOrigins(
                    "http://*.my-api.com",
                    "http://*.my-api.service"
                )
...
Run Code Online (Sandbox Code Playgroud)

这似乎不允许 httpS 或当我在请求中指定端口时。

例如:https ://www.my-api.com: 3000

思想可以用 SetIsOriginAllowed() 替换 WithOrigins

services
    .AddCors(options =>
    {
        options.AddPolicy(PolicyName, builder =>
        {
            builder
                .SetIsOriginAllowed(IsOriginAllowed)
Run Code Online (Sandbox Code Playgroud)

其中 IsOriginAllowed 函数定义为:

private static bool IsOriginAllowed(string host)
{
    var corsOriginAllowed = new[] { "my-api.com", "my-api.service" };

    return corsOriginAllowed.Any(origin =>
        Regex.IsMatch(host, $@"^http(s)?://.*{origin}(:[0-9]+)?$", RegexOptions.IgnoreCase));
}
Run Code Online (Sandbox Code Playgroud)

但这根本不起作用,即使正则表达式在我想要的时候也返回真。

有谁知道为什么这不起作用,并且可以向我展示允许 httpS 的正确方法(除了使用 httpS 和不同端口复制 WithOrigins() 中的所有域。

谢谢

Rig*_*iga 6

SetIsOriginAllowed() 确实有效。正在使用 Postman 进行测试,正如所告知的那样,Postman 不关心从服务器返回的标头。浏览器强制执行 Cors 标头。

为了测试正确地在测试站点下创建了一个小的 html 页面,使用下面的 javascript

<html>
    <script>
        fetch('http://test.com:5000/v2/campaign/hallo3').then(function(response) {
            return response.json();
        }).then(function(j) {            
	        alert(JSON.stringify(j));
        });
    </script>
</html>
Run Code Online (Sandbox Code Playgroud)

当域不包含在 Cors 允许列表中时,浏览器不会显示 API 返回的值

域不允许

将测试域添加到允许的域列表后,浏览器显示数据并获取内容 Cors 标头

在此输入图像描述

另一个问题是,仅使用 SetIsOriginAllowed() 服务器不会发送“Vary”标头。必须同时设置:

.SetIsOriginAllowed(IsOriginAllowed)
.WithOrigins(corsOriginAllowed)
Run Code Online (Sandbox Code Playgroud)