' Access-Control-Allow-Origin'的价值响应中的标题不能是通配符' *'当请求的凭据模式为' include'

时间:2018-02-19 07:26:10

标签: c# angular asp.net-web-api asp.net-core cors

我的应用程序在IE浏览器中工作正常,但由于CORS问题,它无法在Chrome浏览器中运行。

问题是

  

无法加载http://localhost:52487/api/Authentication/:' Access-Control-Allow-Origin'响应中的标题不能是通配符' *'当请求的凭据模式为' include'时。起源' http://localhost:4200'因此不允许访问。 XMLHttpRequest发起的请求的凭证模式由withCredentials属性控制。

我在前端使用angular 2并在后端使用Asp.net core 1.0。我试过了

这是我的启动代码

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
    {
        options.AddPolicy("AllowAll", p =>
        {
            p.AllowAnyOrigin()
            .AllowAnyHeader()
            .AllowAnyMethod();
        });
    });

    // Add framework services.
    services.AddMvc();
    // Add functionality to inject IOptions<T>
    services.AddOptions();
    // Add our Config object so it can be injected
    services.Configure<Data>(Configuration.GetSection("Data"));

    services.Configure<COCSettings>(Configuration.GetSection("COCSettings"));

    services.Configure<EmailSettings>(Configuration.GetSection("EmailSettings"));

    AppSettings.ConnectionString = Configuration["Data:DefaultConnectionString"];

    // *If* you need access to generic IConfiguration this is **required**
    services.AddSingleton<IConfiguration>(Configuration);

    // Injecting repopsitories with interface
    AddServices(services);

    // Add Json options
    services.AddMvc().AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver());
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();
    app.UseMiddleware(typeof(ErrorHandling));
    app.UseMiddleware(typeof(GetNoCache));
    app.UseCors("AllowAll");
    app.UseMvc();
}

这就是我从UI(角度)方面调用API的方式

constructor(private http: Http) {
    this.headers = new Headers();
    this.headers.append('Accept', 'application/json');
}

GetMaintainCOC(FYONId) {
    return this.http.get(this.apiUrl + 'GetCertificationofConformity?FYONId=' + FYONId, { withCredentials: true })
    .map(responce => <any>responce.json())
    .catch(error => {
        return Observable.throw(error);
    });
}

2 个答案:

答案 0 :(得分:4)

当我在AllowCredentials()

内拨打AddPolicy时,它正常工作
 services.AddCors(options =>
            {
                options.AddPolicy("AllowAll", p =>
                {
                    p.AllowAnyOrigin()
                    .AllowAnyHeader()
                    .AllowAnyMethod()
                    .AllowCredentials();
                });
            });

我从中获得了这个想法 Access-Control-Allow-Origin: "*" not allowed when credentials flag is true, but there is no Access-Control-Allow-Credentials header

我的理解

  

我在角度{ withCredentials: true }服务电话中使用http。所以我想我应该在AllowCredentials()服务中使用CORS政策。

答案 1 :(得分:1)

嗯,你似乎已经解决了,但这是简单的答案。

如果在请求定义中设置withCredentials标志,则会在请求中传递cookie等。否则他们将不会通过。

如果您的服务器返回任何Set-Cookie响应标头,那么您必须同时返回Access-Control-Allow-Credentials: true响应标头,否则Cookie 将无法创建在客户端上。如果您这样做,则需要同时Access-Control-Allow-Origin响应标头中指定EXACT来源,因为Access-Control-Allow-Origin: *与凭据不兼容。

这样做:

  • 在请求中传递withCredentials
  • 通过Access-Control-Allow-Origin: <value-of-Origin-request-header>回复标题
  • 通过Access-Control-Allow-Credentials: true回复标题