当前位置:  开发笔记 > 编程语言 > 正文

.NET Core UseCors()不添加标头

如何解决《.NETCoreUseCors()不添加标头》经验,为你挑选了2个好方法。

这将是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 IEnumerable ContactsPreview()
    {
        // ...
    }
}

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的工作原理



1> David..:

问题是当使用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",以及您要支持的任何自定义标题.



2> Luis Cantero..:

仅在以下情况下返回Access-Control-Allow-Origin标头:

    该请求包括"Origin"标题.

    请求的来源与CORS政策相匹配.

然后,服务器返回带有原始URL的ACAO标头作为值.

Origin标头通常由XMLHttpRequest对象设置.

有关更多信息,请参阅CORS的工作原理

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有