.Net Core API CORS,仅锁定一个域(Angular 应用程序)

Posted

技术标签:

【中文标题】.Net Core API CORS,仅锁定一个域(Angular 应用程序)【英文标题】:.Net Core API CORS, lock down to only one domain (Angular app) 【发布时间】:2017-12-03 02:09:11 【问题描述】:

我有一个 .net 核心 api,我只想接受来自一个域的调用。那里托管了一个 Angular 4 应用程序。

我正在创建这样的 cors 策略...

    services.AddCors(options =>
        
            options.AddPolicy("AllowSpecificOrigin",
                builder => builder.WithOrigins("http://www.test.com").AllowAnyHeader());
        );

并且正在像这样加载它......

  app.UseCors("AllowSpecificOrigin");

我原以为只有来自域上的 Angular 应用程序的调用才能访问 api,但是如果我在 Chrome Postman 中创建调用,我仍然可以直接访问 api。

我做错了什么?我想锁定除 Angular 应用程序之外的所有流量。

这里有更多关于我的 startup.cs 的详细信息...

    public Startup(IHostingEnvironment env)
    
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", true, true)
            .AddJsonFile($"appsettings.env.EnvironmentName.json", true)
            .AddEnvironmentVariables();


        Configuration = builder.Build();
    

    public void ConfigureServices(IServiceCollection services)
    
        services.AddMvc();
        services.AddCors();

        services.Configure<AppSettings>(Configuration);
    

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    
            app.UseCors(builder => builder.WithOrigins(new[]  "http://test.com" ) 
                .AllowCredentials()); 


            app.UseDeveloperExceptionPage();

            app.UseMvc(routes =>
            
                routes.MapRoute(
                    "default",
                    "controller=ping/action=get/id?");
            );

            app.UseStaticFiles();

        

【问题讨论】:

这听起来很有趣,服务器的标头响应是什么? (您是在使用 Kestrel 吗?还是使用 IIS 管道) 响应中的标题如下所示... Content-Encoding →gzip Content-Type →text/plain; charset=utf-8 日期 →Thu, 2017 Jun 29 11:45:28 GMT 服务器 →Kestrel Transfer-Encoding →chunked Vary →Accept-Encoding X-Powered-By →ASP.NET 嗯,我不确定是否考虑了您的政策。 Kestrel 应该添加一个标题(看看这个微软的例子docs.microsoft.com/en-us/aspnet/core/security/…) 我认为是因为如果你不设置它网站无法访问api,但是邮递员总是可以的。 您的问题解决了吗? 【参考方案1】:

反应更容易:

CORS 标头仅在跨域请求 See that example 时发送

所以,当您在本地测试时,它不起作用。尝试将您的应用程序托管在具有域的服务器上并与邮递员通话。它不会起作用。

编辑:

好的,是你的配置文件不正确。您需要将AddCors 放在AddMVC 之前。因为,在执行管道中,框架会按照你在启动时声明的顺序执行..

services.AddCors(options =>
        
            options.AddPolicy("AllowSpecificOrigin",
                politique => politique.WithOrigins("yourdomain").AllowAnyHeader().AllowAnyMethod().AllowCredentials());
        );

eapp.UseCors("AllowSpecificOrigin");

【讨论】:

这就是我所希望的,但由于某种原因我仍然可以成功调用它。 好的,有了你的配置,我就明白了。查看我的编辑 我加个例子 谢谢,我还能打电话。在 IIS 端有什么需要做的吗?这很奇怪。感谢您迄今为止的帮助。 这个时候嗯,我不知道。但是不要忘记将services.AddCors(); 放在services.AddMvc(); 之前,因为这是一个错误的配置(我可以看到您没有编辑您的示例)

以上是关于.Net Core API CORS,仅锁定一个域(Angular 应用程序)的主要内容,如果未能解决你的问题,请参考以下文章

asp.net core 系列之允许跨域访问2之测试跨域(Enable Cross-Origin Requests:CORS)

在 .NET Core Web API 上为 CORS 启用 OPTIONS 标头

如何在ASP NET Core中实现CORS跨域

.Net Core CORS跨域详解及使用

在 ASP.Net 5 / Core 中启用跨域资源共享 (CORS)

无法在 ASP.NET Core 1.0 中启用跨域请求 (CORS)