在Topshelf托管服务上启用来自特定来源的CORS

时间:2019-02-23 09:23:23

标签: c# .net-4.7 web.api

我确定这是重复的,但我发现的答案似乎都无效。

我有一个web.api作为Windows服务托管,我需要允许CORS到两个特定的来源。

我的startup.cs中有这个

config.EnableCors(
            new EnableCorsAttribute("http://customer.mydomain.com, 
                                     http://admin.mydomain.com", "*", "*")
            );
        var policy = new CorsPolicy()
        {
            AllowAnyHeader = true,
            AllowAnyMethod = true,
            SupportsCredentials = true
        };

        policy.Origins.Add("*http://customer.mydomain.com");
        policy.Origins.Add("*http://admin.mydomain.com");

        app.UseCors(new CorsOptions
        {
            PolicyProvider = new CorsPolicyProvider
            {
                PolicyResolver = context => Task.FromResult(policy)
            }
        });

所以我在这里的理解是,我将只允许从管理员和客户子域访问我的服务?

然后在我的控制器顶部

[EnableCors("*.mydomain.com","*","*")]  
public class MasterDataController

一切都建立并且很高兴,但是当我运行我的服务并直接从浏览器URL调用控制器中的方法时,它会很好地响应,这是否应该阻止了我,因为我没有从mydomain.com调用它? / p>

我已经看到回答,说我需要在呼叫中发送始发地,但是肯定不是答案,因为我特别想停止呼叫,除非它们来自允许的起源?我觉得我在这里转圈

[更新] 我还添加了

   <httpProtocol>
 <customHeaders>
   <add name="Access-Control-Allow-Origin" value="*.bizcash.co.za" />
 </customHeaders>

到我的IIS代理,如果我在直接调用该方法时检查响应标头,则会看到以下内容

enter image description here * .reded显然是我的域名。但是,我仍然可以直接从浏览器中调用它,并且不应该这样吗?它应该只允许从我的域拨打电话吗?

1 个答案:

答案 0 :(得分:0)

好的,所以有两个问题。

添加特定的CORS来源并不会阻止您直接在浏览器中调用该服务,而是会阻止其他Web应用程序对其进行调用。所以我测试错了。

因此,您需要进行更改,将其部署到服务器上,然后通过常规应用程序对其进行测试。

要使其正常工作,这就是我最终要拥有的

           var policy = new CorsPolicy()
        {
            AllowAnyHeader = true,
            AllowAnyMethod = true
        };

        policy.Origins.Add("https://customer.mydomain.com");
        policy.Origins.Add("https://admin.mydomain.com");

        app.UseCors(new CorsOptions
        {
            PolicyProvider = new CorsPolicyProvider
            {
                PolicyResolver = context => Task.FromResult(policy)
            }
        });

就是这样,仅在startup.cs中就可以了。希望我可以挽救别人浪费生命的两天