Asp.net Core CORS适用于GET,但不适用于POST

时间:2017-08-13 13:23:00

标签: asp.net-core cors asp.net-core-mvc

我正在使用带有Asp核心web api的Angular 4应用程序,我在locahost上测试了不同的端口。我的WebApi需要Windows身份验证(需要获取登录用户名)。所有使用GET的调用工作,但不幸的是,我无法让POST工作。我有CORS的WebApi设置:

        public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddApplicationInsightsTelemetry(Configuration);
        services.AddDbContext<CatalogContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
        services.AddCors(options =>
        {
            options.AddPolicy("AllowAll", builder =>
            {
                builder.AllowAnyOrigin()
                    .AllowAnyHeader()
                    .AllowAnyMethod()
                    .AllowCredentials();
            });

        });
        services.AddMvc();
    }

而angular 4客户端正试图发布文件

fileChange(event) {
let fileList: FileList = event.target.files;
if (fileList.length > 0) {
  let file: File = fileList[0];
  let formData: FormData = new FormData();
  formData.append('uploadFile', file, file.name);
  let headers = new Headers();
  /** No need to include Content-Type in Angular 4 */
  headers.append('Content-Type', 'multipart/form-data');
  headers.append('Accept', 'application/json');

  let options = new RequestOptions({ headers: headers, withCredentials: true });
  this.http.post("http://localhost:495/api//upload",formData, options)
    .map(res => res.json())
    .catch(error => Observable.throw(error))
    .subscribe(
    data => console.log('success'),
    error => console.log(error)
    )
}

我的错误:

XMLHttpRequest无法加载http://localhost:495/api//upload。 No&#39; Access-Control-Allow-Origin&#39;标头出现在请求的资源上。起源&#39; http://localhost:4200&#39;因此不允许访问。响应的HTTP状态代码为500。

和响应标题

的Content-Length:0 日期:太阳,2017年8月13日13:13:09 GMT 持久验证:真 服务器:红隼 X-已启动方式:ASP.NET X-SourceFiles:????= UTF-8乙QzpcU291cmNlIENvZGVcUGFydG5lcnNoaXBDYXRhbG9nXFBhcnRuZXJzaGlwQ2F0YWxvZ1xQYXJ0bmVyc2hpcENhdGFsb2cuV2ViQXBpXGFwaVx1cGxvYWQ = =

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

你需要这样的东西:

services.AddCors(options =>
      {
        options.AddPolicy("CorsPolicy",
            builder => 
            builder.AllowAnyOrigin()
            .AllowAnyMethod()
            .WithExposedHeaders("content-disposition")
            .AllowAnyHeader()
            .AllowCredentials()
            .SetPreflightMaxAge(TimeSpan.FromSeconds(3600)));
      });

注意AllowCredentials()

您还需要使用Startup文件Configure方法:

app.UseCors("CorsPolicy");

答案 1 :(得分:2)

预检请求(OPTIONS)不会向服务器发送身份验证信息。因此,除了WinAuth之外,还需要启用Anonymous Auth。请参阅:https://stackoverflow.com/a/50354772/946773