.NET Core UseCors()不添加标头
这将是Access-Control-Allow-Origin标头如何工作的重复? ,但那里的方法也不适合我。 我希望我只是缺少一些东西。
我试图从我的.NET Core Web API的响应中获取一个Access-Control-Allow-Origin
标头,我通过AJAX访问它。
我尝试过几件事。 除非另有说明,否则所有内容都在Startup.cs
文件中。
方法1
根据Microsoft文档 :
public void ConfigureServices(IServiceCollection services) { // Add database services.AddDbContext(options => options.UseSqlServer(Configuration.GetConnectionString("DbConnection"))); // Add the ability to use the API with JSON services.AddCors(); // Add framework services. services.AddMvc(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { loggerFactory.AddConsole(Configuration.GetSection("Logging")); loggerFactory.AddDebug(); if (env.IsDevelopment()) { using (var serviceScope = app.ApplicationServices.GetRequiredService().CreateScope()) { serviceScope.ServiceProvider.GetService().Database.Migrate(); serviceScope.ServiceProvider.GetService().EnsureSeedData(); } } app.UseCors(builder => builder.WithOrigins("https://localhost:44306").AllowAnyMethod()); app.UseJwtBearerAuthentication(new JwtBearerOptions { Authority = Configuration["Authentication:AzureAd:AADInstance"] + Configuration["Authentication:AzureAd:TenantId"], Audience = Configuration["Authentication:AzureAd:Audience"], }); app.UseMvc(); }
方法2
public void ConfigureServices(IServiceCollection services) { // ... services.AddCors(options => options.AddPolicy("AllowWebApp", builder => builder.AllowAnyMethod() .AllowAnyMethod() .AllowAnyOrigin())); //.WithOrigins("https://localhost:44306"))); // ... } public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { // ... app.UseCors("AllowWebApp"); // ... }
我也尝试在Controller和Method上添加[EnableCors("AllowWebApp")]
。
从邮差,我得到:
content-encoding→gzip
content-type→text / plain; 字符集= utf-8的
日期→星期三,2017年1月25日04:51:48 GMT
服务器→红隼
状态→200
变化→接受编码
x-powered-by→ASP.NET
x-sourcefiles→=?UTF-8?B?[删除]
我也在Chrome中尝试过,并获得了类似的标题。
如果重要,我尝试访问的方法上有一个Authorize
属性。 但那部分应该工作正常(我至少得到了很好的回应)
那么,我是否遗漏了一些非常明显的东西,或者这是否会被打破? 我目前正在运行1.1.0版。
编辑添加JS和Controller Stub
function getContactPreviews(resultsCallback) { var xmlhttp = new XMLHttpRequest(); xmlhttp.onreadystatechange = () => { if (xmlhttp.readyState == XMLHttpRequest.DONE && xmlhttp.status == 200) { resultsCallback(JSON.parse(xmlhttp.response)); } } xmlhttp.open("GET", "https://localhost:44357/api/User/ContactsPreview", true); xmlhttp.setRequestHeader("Authorization", "Bearer " + localStorage.getItem("AuthorizationToken")); xmlhttp.send(); }
控制器存根
[Authorize] [Route("api/[controller]")] public class UserController : ApiController { [HttpGet(nameof(ContactsPreview))] [EnableCors("AllowWebApp")] public IEnumerable ContactsPreview() { // ... } }
问题是,当使用承载认证(或任何我想象的)时,它会添加一个标题“授权”,如果设置允许该标头,服务器将只提供一个好的。
有两种方法可以解决问题,下面是唯一需要的代码。 它位于Web API解决方案的Startup.cs
中的Configure()
方法中。
方法1:允许所有标头
app.UseCors(builder => builder.WithOrigins("https://localhost:44306") .AllowAnyMethod() .AllowAnyHeader());
方法2:允许特定标头
app.UseCors(builder => builder.WithOrigins("https://localhost:44306") .AllowAnyMethod() .WithHeaders("authorization", "accept", "content-type", "origin"));
额外的标题是因为,根据文档:
浏览器在设置Access-Control-Request-Headers方面并不完全一致。 如果将标题设置为“*”以外的任何标题,则应至少包括“accept”,“content-type”和“origin”,以及您要支持的任何自定义标题。
仅在以下情况下返回Access-Control-Allow-Origin标头:
- 该请求包括“Origin”标题。
- 请求的来源与CORS政策相匹配。
然后,服务器返回带有原始URL作为值的ACAO标头。
Origin标头通常由XMLHttpRequest对象设置。
有关更多信息,请参阅CORS的工作原理
在Startup.cs文件中,添加以下内容
public CorsPolicy GenerateCorsPolicy(){ var corsBuilder = new CorsPolicyBuilder(); corsBuilder.AllowAnyHeader(); corsBuilder.AllowAnyMethod(); corsBuilder.AllowAnyOrigin(); // For anyone access. //corsBuilder.WithOrigins("http://localhost:56573"); // for a specific url. Don't add a forward slash on the end! corsBuilder.AllowCredentials(); return corsBuilder.Build(); }
在ConfigureServices方法中:
services.AddCors(options => { options.AddPolicy("AllowAllOrigins", GenerateCorsPolicy()); });
//在整个应用程序中全局应用CORS //在Configure方法中,添加
app.UseCors("AllowAllOrigins");
[DisableCors]
使用DisableCors属性,我们可以为控制器或操作禁用CORS。
//启用CORS控制器 – 如果全局应用,则不需要此。
[EnableCors("AllowAllOrigins")] public class HomeController: Controller {}
- ASP.NET核心JWT承载令牌自定义validation
- .Net MVC 4项目因事件日志错误而失败“模块DLL C:\ WINDOWS \ system32 \ inetsrv \ aspnetcore.dll无法加载。 数据是错误的。”
- 使用HttpClient,HTTPS请求失败
- 没有数据库提供程序配置EF7
- ASP.NET MVC 6上每个控制器的特定JSON设置
- 数据模型未显示在HttpResponseMessage中
- ASP.NET Core Web API:程序不包含适用于入口点的静态“Main”方法
- 使用RequireHttpsAttribute ASP.NET Core的HTTP错误310 ERR_TOO_MANY_REDIRECTS
- ASP.NET Core 2.0 JWTvalidation因“用户授权失败:(null)”错误而失败