这将是Access-Control-Allow-Origin标头如何工作的重复?,但那里的方法也不适合我.我希望我只是遗漏了一些东西.
我试图Access-Control-Allow-Origin
通过我的.NET Core Web API在我的响应中获得一个标题,我通过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"); // ... }
我也尝试过添加[EnableCors("AllowWebApp")]
Controller和Method.
从Postman,我得到:
content-encoding→gzip
content-type→text/plain; charset = utf-8
date→Wed,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 IEnumerableContactsPreview() { // ... } }
David.. 24
问题是当使用Bearer身份验证(或任何我想象的)时,它会添加一个标题"Authorization",如果设置允许该标头,服务器将只提供一个正常的.
有两种方法可以解决问题,下面是唯一需要的代码.它包含在Web API解决方案中的Configure()
方法中Startup.cs
.
方法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",以及您要支持的任何自定义标题.
Luis Cantero.. 8
仅在以下情况下返回Access-Control-Allow-Origin标头:
该请求包括"Origin"标题.
请求的来源与CORS政策相匹配.
然后,服务器返回带有原始URL的ACAO标头作为值.
Origin标头通常由XMLHttpRequest对象设置.
有关更多信息,请参阅CORS的工作原理
问题是当使用Bearer身份验证(或任何我想象的)时,它会添加一个标题"Authorization",如果设置允许该标头,服务器将只提供一个正常的.
有两种方法可以解决问题,下面是唯一需要的代码.它包含在Web API解决方案中的Configure()
方法中Startup.cs
.
方法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的工作原理