当前位置: 首页 > 知识库问答 >
问题:

ASP.NET Core CORS WebAPI:无访问-控制-允许-起源头

奚昌胤
2023-03-14

我已经将我的ASP.NET核心web API部署到Azure上,我可以使用Swagger或像Fiddler这样的web调试器访问它的endpoint。在这两种情况下(在Swagger中使用相同的来源,在我的计算机中使用Fiddler使用不同的来源),当访问API时,我会得到预期的结果,在我的startup.cs中启用CORS如下所示:

>

  • 添加services.addcors();configureservices

    
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, 
        ILoggerFactory loggerFactory,
        IDatabaseInitializer databaseInitializer)
    {
        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();
        loggerFactory.AddNLog();
    
        // to serve up index.html
        app.UseDefaultFiles();
        app.UseStaticFiles();
    
        // http://www.talkingdotnet.com/aspnet-core-diagnostics-middleware-error-handling/
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
    
        // CORS
        // https://docs.asp.net/en/latest/security/cors.html
        app.UseCors(builder =>
                builder.WithOrigins("http://localhost:4200", "http://www.myclientserver.com")
                    .AllowAnyHeader()
                    .AllowAnyMethod());
    
        app.UseOAuthValidation();
        app.UseOpenIddict();
        app.UseMvc();
    
        databaseInitializer.Seed().GetAwaiter().GetResult();
        env.ConfigureNLog("nlog.config");
    
        // swagger
        app.UseSwagger();
        app.UseSwaggerUi();
    }
    

    使用Fiddler,我可以成功地访问远程API,但没有获得access-control-allog-origin标头。因此,当从浏览器(通过我的客户端应用程序)调用API时,AJAX请求失败,即使服务器返回200。样例Fiddler请求(成功):

    GET http://mywebapisiteurl/api/values HTTP/1.1
    User-Agent: Fiddler
    

    回应:

    HTTP/1.1 200 OK
    Transfer-Encoding: chunked
    Content-Type: application/json; charset=utf-8
    Server: Microsoft-IIS/8.0
    X-Powered-By: ASP.NET
    Set-Cookie: ARRAffinity=3d551180c72208c1d997584c2b6119cf44e3a55c868f05ffc9258d25a58e95b1;Path=/;Domain=prinapi.azurewebsites.net
    Date: Thu, 01 Dec 2016 10:30:19 GMT
    
    ["value1","value2"]
    

    当试图访问部署在Azure上的远程API时,我的客户端应用程序总是以错误的方式失败其AJAX请求:

    No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://www.myclientserver.com' is therefore not allowed access.
    
    import {Component, NgModule} from '@angular/core';
    import {BrowserModule} from '@angular/platform-browser';
    import { Http, Headers, Response } from '@angular/http';
    import { HttpModule } from '@angular/http';
    
    @Component({
      selector: 'my-app',
      template: `
        <div>
          <h2>Hello {{name}}</h2>
          <button (click)="test()">test</button>
        </div>
      `,
    })
    export class App {
      name:string;
      constructor(private _http: Http) {
        this.name = 'Angular2'
      }
      public test() {
        this._http.get('http://theapisiteurlhere/api/values',
        {
            headers: new Headers({
              'Content-Type': 'application/json'
            })
        })
        .subscribe(
          (data: any) => {
            console.log(data);
          },
          error => {
            console.log(error);
          });
      }
    }
    
    @NgModule({
      imports: [ BrowserModule, HttpModule ],
      declarations: [ App ],
      bootstrap: [ App ]
    })
    export class AppModule {}
    
    GET http://theapiserver/api/values HTTP/1.1
    User-Agent: Fiddler
    Host: theapiserver
    Origin: http://theappserver/apps/prin
    
    HTTP/1.1 200 OK
    Content-Type: application/json; charset=utf-8
    Server: Microsoft-IIS/8.0
    Access-Control-Allow-Origin: http://theappserver/apps/prin
    X-Powered-By: ASP.NET
    Set-Cookie: ARRAffinity=3d551180c72208c1d997584c2b6119cf44e3a55c868f05ffc9258d25a58e95b1;Path=/;Domain=theapiserver
    Date: Thu, 01 Dec 2016 14:15:21 GMT
    Content-Length: 19
    
    ["value1","value2"]
    

    来自Angular2(Plunker)的请求/响应反而失败了,正如所报告的那样。通过检查网络流量,我只能看到飞行前请求:

    OPTIONS http://theapiserver/api/values HTTP/1.1
    Host: theapiserver
    Proxy-Connection: keep-alive
    Access-Control-Request-Method: GET
    Origin: http://run.plnkr.co
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36
    Access-Control-Request-Headers: content-type
    Accept: */*
    Referer: http://run.plnkr.co/h17wYofXGFuTy2Oh/
    Accept-Encoding: gzip, deflate, sdch
    Accept-Language: en-US,en;q=0.8,it;q=0.6
    
    HTTP/1.1 204 No Content
    Server: Microsoft-IIS/8.0
    X-Powered-By: ASP.NET
    Set-Cookie: ARRAffinity=3d551180c72208c1d997584c2b6119cf44e3a55c868f05ffc9258d25a58e95b1;Path=/;Domain=theapiserver
    Date: Thu, 01 Dec 2016 14:23:02 GMT
    

    在此之后,请求失败,没有更多的通信流到服务器。报告的问题是对飞行前请求的响应没有通过访问控制检查,这也是因为响应中缺少标头:

    XMLHttpRequest cannot load http://theapiserver/api/values. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://run.plnkr.co' is therefore not allowed access.
    
  • 共有1个答案

    寿元白
    2023-03-14

    以下是我自己的问题的答案,从评论中复制过来:我没有注意到在Azure portal中有一个CORS部分。如果我不在那里输入任何允许的原点,我的基于代码的配置似乎完全不相关。在我看来,这很奇怪,因为我不得不在这里复制URL,但是一旦我将*添加到允许的起源中,它就起作用了。

     类似资料:
    • 问题内容: 我尝试使用以下代码通过$ http(角度)发送http请求: 但这不起作用,并且我在Web控制台中有此错误: 你有解决方案吗 ? 问题答案: 您看到此错误是由于在浏览器中实现的称为Same Origin Policy的安全机制所致。 基本上,这是由于您的网页尝试访问驻留在与网页本身不同的主机,端口或方案(HTTP / HTTPS /文件等)所在的服务器上的资源而引起的。 为了解决此问题

    • 我正在创建一个脚本,加载在其他网站的外部。它加载CSS和HTML,在我自己的服务器上工作得很好。 但还是不管用。

    • 我有错误: XMLHttpRequest 无法加载 http://localhost:5984/cp_config/。当凭据标志为 true 时,不能在“访问控制-允许-源”标头中使用通配符“*”。因此,不允许访问源“http://localhost”。XMLHttpRequest 的凭据模式由 withCredentials 属性控制。 但我有一个标题: 我该如何解决这个问题?

    • 问题内容: 我正在使用以下脚本- 我尝试访问的计算机正在运行播放框架。我收到以下错误: 选项404(未找到)jquery-1.9.1.min.js:5 XMLHttpRequest无法加载。原产地不被访问控制允许来源允许的。 我已经难过了两天,有人可以帮我吗? 提前谢谢 问题答案: 问题是您正在尝试进行跨域调用(从到)。Same Origin Policy 不允许这样做,因此浏览器试图使用跨域资源

    • 你有解决办法吗?

    • 问题内容: 我看到以下错误: 使用此代码: 是什么原因引起的,如何解决? 问题答案: 在当前域之外发出ajax请求时,Javascript是受限制的。 例1:您的域名为example.com,并且您想向test.com提出请求=>您不能。 例2:您的域名是example.com,并且您想向inner.example.com发送请求,但是您不能。 例3:您的域名为example.com:80,并且您