问题描述
我有一个由两部分组成的系统:.NET Core 2.1后端Web API和Angular 5前端。对于所有POST / PUT请求,我都有一个错误:
在以下位置访问XMLHttpRequest 来源的“ https:// BACK_END_PATH / api / documents” “ https:// FRONT_END_PATH”已被CORS政策阻止: 对预检请求的响应未通过访问控制检查:否 请求中出现“ Access-Control-Allow-Origin”标头 资源。
,并为预检请求返回HTTP状态代码401。
在Angular中,我使用Windows身份验证并使用凭据发送请求:
intercept(request: HttpRequest<any>,next: HttpHandler): Observable<HttpEvent<any>> {
// add windows credentials
request = request.clone({
withCredentials: true
});
}
我已经为所有请求,方法,标头和凭据打开了CORS,并检查了MORS之前是否应用了CORS:
readonly string CorsAllowSpecificOrigins = "_corsAllowSpecificOrigins";
public void ConfigureServices (IServiceCollection services)
{
// allow CORS
services.AddCors (options => {
options.AddPolicy (CorsAllowSpecificOrigins,builder => {
builder.AllowAnyOrigin()
.AllowAnyHeader()
.AllowCredentials()
.AllowAnyMethod ();
});
});
services.AddMvc (options => {
options.Filters.Add (typeof (ModelValidatorFilter));
})
.SetCompatibilityVersion (CompatibilityVersion.Version_2_1);
//comment for brevity
}
public void Configure (IApplicationBuilder app,IHostingEnvironment env)
{
//comment for brevity
app.UseCors (CorsAllowSpecificOrigins);
app.UseHttpsRedirection ();
app.UseMvc (routes => {
routes.MapRoute (
name: "default",template: "{controller}/{action=Index}/{id?}");
});
}
我以为问题是'application / json'Content-Type,但是Postman中使用了相同的类型,Postman请求工作正常。
我还找到了一个打开匿名用户的解决方案,但不幸的是,我无法在系统中使用此技巧。
Update1:我也试图通过这种方式设置原点:
builder.WithOrigins("https://FRONT_END_PATH")
.SetIsOriginAllowedToAllowWildcardSubdomains()
.AllowAnyHeader()
.AllowCredentials()
.AllowAnyMethod();
但错误是相同的。
解决方法
在this doc中,您可以找到以下信息:
CORS预检请求用于确定服务器是否将请求的资源设置为跨源共享。并且OPTIONS请求始终是匿名的,如果未启用匿名身份验证,服务器将无法正确响应预检请求。
要解决此问题,如果您在本地运行该应用程序以进行CORS测试,则可以尝试启用匿名身份验证。
此外,如果您的应用托管在IIS上,则可以尝试安装IIS CORS module并为该应用配置CORS。