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

Tom*_*ski 9 cors asp.net-core-mvc asp.net-core

我正在使用带有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();
    }
Run Code Online (Sandbox Code Playgroud)

而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)
    )
}
Run Code Online (Sandbox Code Playgroud)

我的错误:

XMLHttpRequest无法加载http:// localhost:495/api // upload.请求的资源上不存在"Access-Control-Allow-Origin"标头.因此不允许来源' http:// localhost:4200 '访问.响应的HTTP状态代码为500.

和响应标头

内容长度:0日期:孙老师,2017年8月13日13时13分09秒GMT持久验证:真服务器:红隼X-已启动方式:ASP.NET X-SourceFiles:= UTF-的8B QzpcU291cmNlIENvZGVcUGFydG5lcnNoaXBDYXRhbG9nXFBhcnRuZXJzaGlwQ2F0YWxvZ1xQYXJ0bmVyc2hpcENhdGFsb2cuV2ViQXBpXGFwaVx1cGxvYWQ =??? =

任何帮助,将不胜感激!

jmj*_*rri 6

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


dee*_* zg 5

你需要这样的东西:

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

注意AllowCredentials()

您还需要在Startup文件Configure方法中:

app.UseCors("CorsPolicy");
Run Code Online (Sandbox Code Playgroud)