我的应用程序在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);
});
}
答案 0 :(得分:4)
当我在AllowCredentials()
AddPolicy
时,它正常工作
services.AddCors(options =>
{
options.AddPolicy("AllowAll", p =>
{
p.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials();
});
});
我在角度
{ 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: *
与凭据不兼容。
这样做:
Access-Control-Allow-Origin: <value-of-Origin-request-header>
回复标题Access-Control-Allow-Credentials: true
回复标题