5

這將是How does Access-Control-Allow-Origin header work?的重複,但那裏的方法也不適合我。我希望我只是錯過了一些東西。.NET核心UseCors()不添加標頭

我想在我的.NET Core Web API(我通過AJAX訪問)的響應中得到一個Access-Control-Allow-Origin頭文件。

我試了幾件事。除非另有說明,所有文件都在Startup.cs文件中。

方法1

作爲每Microsoft Documentation

public void ConfigureServices(IServiceCollection services) 
{ 
    // Add database 
    services.AddDbContext<DbContext>(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<IServiceScopeFactory>().CreateScope()) 
     { 
      serviceScope.ServiceProvider.GetService<DbContext>().Database.Migrate(); 
      serviceScope.ServiceProvider.GetService<DbContext>().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")]

從郵差,我得到:

內容編碼

→gzip的
內容類型→文本/無格式;字符集= UTF-8
日期→星期三,2017年1月25日4時51分48秒GMT
服務器→茶隼
狀態→200
變化→接受編碼
的x通電由→ASP.NET
x-sourcefiles→=?UTF-8?B [編輯]

我也在Chrome中試過它,並且得到了類似的頭文件。

如果很重要,我試圖訪問的方法有一個Authorize屬性。但那部分應該工作正常(我至少得到了一個很好的迴應)

所以,我是否錯過了一些非常明顯的東西,或者這是否會被打破?我目前正在運行版本1.1.0。


編輯添加JS和控制器存根

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<Customer> ContactsPreview() 
    { 
     // ... 
    } 
} 
+0

你怎麼打郵遞員服務器?標題只會返回一個OPTIONS請求 – Rob

+0

@Rob。這就是我所錯過的。 Postman方面的情況並不如此(我曾在Chrome中嘗試過,並且使用了正確的方法),在控制器方面更是如此。我有'[HttpGet]'而不是'[HttpOptions]'。我有一種感覺,那就是那種愚蠢的東西。 – David

+0

@Rob,但Chrome仍然失敗。它出現了204錯誤。郵差工作完美。兩者都使用相同的持票人令牌。 Chrome中禁用緩存。 – David

回答

6

的問題是,使用時承載認證(或任何我可以想象),它增加了一個頭「授權」,如果安裝程序允許該標頭,則服務器只會給出好的結果。

有兩種方法可以解決這個問題,下面是只有需要的代碼。它在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")); 

額外的標頭是因爲,每個文檔:

瀏覽器不完全是consiste在他們如何設置訪問控制請求頭。如果您將標題設置爲除「*」以外的任何標題,則至少應該包含「接受」,「內容類型」和「來源」,以及您要支持的任何自定義標題。