.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 标头