GVKun编程网logo

React + ASP.NET.Core:所请求的资源上不存在“ Access-Control-Allow-Origin”标头(所请求的资源不可用哪里错了)

14

本篇文章给大家谈谈React+ASP.NET.Core:所请求的资源上不存在“Access-Control-Allow-Origin”标头,以及所请求的资源不可用哪里错了的知识点,同时本文还将给你拓展

本篇文章给大家谈谈React + ASP.NET.Core:所请求的资源上不存在“ Access-Control-Allow-Origin”标头,以及所请求的资源不可用哪里错了的知识点,同时本文还将给你拓展AJAX请求获取“所请求的资源上不存在'Access-Control-Allow-Origin'标头”错误、ASP NET CORE – ANGULAR NO’Access-Control-Allow-Origin’标头出现在请求的资源上、asp.net – CORS错误 – 请求的资源上没有“Access-Control-Allow-Origin”标头、CORS问题-所请求的资源上没有“ Access-Control-Allow-Origin”标头等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

React + ASP.NET.Core:所请求的资源上不存在“ Access-Control-Allow-Origin”标头(所请求的资源不可用哪里错了)

React + ASP.NET.Core:所请求的资源上不存在“ Access-Control-Allow-Origin”标头(所请求的资源不可用哪里错了)

实际上,这不是 重复的
帖子,我知道在stackoverflow社区中多次问过的标题的一部分,我阅读了所有帖子和答案,但是我认为我使用的问题和技术是不同的。

首先,我应该提到的ASP.NET Core WEB/API是我的后端应用程序,Reactjs也是我的前端应用程序。

我读了一下CORS,发现必须CORSASP.NETApp ''Access-Control-Allow-Origin'':''*''上启用并放入
请求的标头,但是在调用api时仍然出现以下错误:

所请求的资源上没有“ Access-Control-Allow-Origin”标头。因此,不允许访问源’ http://
localhost:8080
‘。该响应的HTTP状态代码为500。如果不透明响应满足您的需求,请将请求的模式设置为“ no-cors”,以在禁用CORS的情况下获取资源。

这是我的Startup.cs代码与CORS

public void ConfigureServices(IServiceCollection services){    // other lines of code    services.AddCors(options =>    {        options.AddPolicy("AllowAll",            builder =>            {                builder                .AllowAnyOrigin()                .AllowAnyMethod()                .AllowAnyHeader();            });    });    services.Configure<MvcOptions>(options =>    {        options.Filters.Add(new CorsAuthorizationFilterFactory("AllowAll"));    });    // other lines of code}public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory){    loggerFactory.AddConsole(Configuration.GetSection("Logging"));    loggerFactory.AddDebug();    app.UseCors("AllowAll");    app.UseAuthentication();    app.UseMvc();}

这是我的反应代码:

function save(message) {    const requestOptions = {        method: ''POST'',        mode: ''cors'',        headers: { ...authHeader(),             ''Content-Type'': ''application/json'',                ''Access-Control-Allow-Origin'':''*'',    },        body: JSON.stringify(message)                   };    return fetch(config.apiUrl + ''/message/save'', requestOptions).then(handleResponse, handleError);}

感谢您的回复。

答案1

小编典典

经过两天的苦难,终于我找到了解决问题的方法。实际上,您的评论之一对我来说是一个很好的线索。

@ kirk-larkin说:

响应的HTTP状态代码500是此处的关键。当您的ASP.NET Core项目中存在异常时,将清除CORS标头。您应该尝试找出为什么引发异常。

我追踪了我的代码很多次,然后发现我忘记在Startup.cs中注册我的控制器中使用的服务。

我在Startup.cs中调用了以下代码,问题得以解决。

services.AddScoped<IMessageService, MessageService>();

AJAX请求获取“所请求的资源上不存在'Access-Control-Allow-Origin'标头”错误

AJAX请求获取“所请求的资源上不存在'Access-Control-Allow-Origin'标头”错误

我尝试GET在jQuery AJAX请求中发送请求。

$.ajax({    type: ''GET'',    url: /* <the link as string> */,    dataType: ''text/html'',    success: function() { alert("Success"); },    error: function() { alert("Error"); },});

但是,无论我尝试过什么, XMLHttpRequest cannot load <page>. No ''Access-Control-Allow-Origin'' header is present on the requested resource. Origin''http://localhost:7776'' is therefore not allowed access.

我尝试了所有操作,从使用AJAX而不是jQuery 添加header :{}定义到AJAX请求,甚至设置dataType为,甚至下载了一个启用CORS的插件-但没有任何帮助。JSONP``text/plain

如果我尝试访问任何其他站点,也会发生同样的情况。

有任何适当且简单解决方案的想法吗?有没有?

答案1

小编典典

这是设计使然。您不能使用XMLHttpRequest向另一台服务器发出任意HTTP请求,除非该服务器通过为请求主机放置Access-Control-
Allow-Origin标头来允许它。

https://developer.mozilla.org/zh-
CN/docs/Web/HTTP/Access_control_CORS

您可以在script标记中检索它(对脚本,图像和样式表没有相同的限制),但是除非返回的内容是脚本,否则它不会给您带来什么好处。

这是有关CORS的教程:

http://www.bennadel.com/blog/2327-cross-origin-resource-sharing-cors-ajax-
requests-between-jquery-and-node-
js.htm

这样做都是为了保护最终用户。假设一个图像实际上是一个图像,一个样式表只是一个样式表,而一个脚本只是一个脚本,向另一台服务器请求这些资源并不会真正造成任何危害。

但总的来说,跨域请求可能会做的不好。假设您Zoltan正在使用coolsharks.com。还要说您已经登录到mybank.com,并且浏览器中有一个mybank.com的cookie。现在,假设coolsharks.com向mybank.com发送了AJAX请求,要求将您的所有资金转入另一个帐户。因为您存储了mybank.com
cookie,所以他们成功完成了请求。所有这些都是在您不知情的情况下发生的,因为没有页面重新加载发生。这是允许一般跨站点AJAX请求的危险。

如果要执行跨站点请求,则有两个选择:

  1. 获取您向其请求的服务器之一
    。通过放入包含您(或*)的Access-Control-Allow-Origin标头来接纳您
    。b。为您提供JSONP API。

要么

  1. 编写自己的不符合标准且没有限制的浏览器。

在(1)中,您必须与要向其请求的服务器合作,在(2)中,您必须对最终用户的浏览器具有控制权。如果您不能履行(1)或(2),那么您很不幸。

但是,还有第三种选择(由charlietfl指出)。您可以从您控制的服务器发出请求,然后将结果传递回页面。例如

<script>$.ajax({    type: ''GET'',    url: ''/proxyAjax.php?url=http%3A%2F%2Fstackoverflow.com%2F10m'',    dataType: ''text/html'',    success: function() { alert("Success"); },    error: function() { alert("Error"); }});</script>

然后在您的服务器上,最简单的方法是:

<?php// proxyAjax.php// ... validation of params// and checking of url against whitelist would happen here ...// assume that $url now contains "http://stackoverflow.com/10m"echo file_get_contents($url);

当然,此方法可能会遇到其他问题:

  • 您代理的站点是否需要正确的引荐来源网址或特定的IP地址?
  • cookie是否需要传递到目标服务器?
  • 您的白名单是否足以保护您免受随意发出的请求?
  • 当服务器接收到哪些标头(例如,修改时间等)时,您将它们传递回浏览器,而您将省略或更改哪些标头?
  • 您的服务器是否被暗示提出了非法请求(因为您是代理人)?

我敢肯定还有其他人。但是,如果所有这些问题都不能阻止它,那么第三种方法可能会很好地工作。

ASP NET CORE – ANGULAR NO’Access-Control-Allow-Origin’标头出现在请求的资源上

ASP NET CORE – ANGULAR NO’Access-Control-Allow-Origin’标头出现在请求的资源上

可能会多次询问此问题,但在线提供的解决方案对我不起作用.

在我们的项目中,我们使用WebMethod作为Asp.Net页面处理数据库,或者如果我这样说,我们有一个WebApi: –

http://server/Pages/ApplicationData.aspx/GetApplicationLookups

现在我们有一个AspNet Core Angular Web应用程序,它调用了这个API

postgetGetApplicationLookups(url: string) {
    var headers = new Headers();
    headers.set('Accept','application/json; charset=utf-8');
    headers.set('content-Type','application/json; charset=utf-8');
    let data = {};
    debugger;
    return this.http.post(
        url,data,{ headers: headers }
    )
        .map(this.handleSuccess)
        .catch(this.handleError)
}

我收到以下错误: –

enter image description here

如果我使用POSTMAN,这个POST调用工作正常: –

enter image description here

我使用以下代码修改了我的Startup.cs但我仍然得到相同的错误.

public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddCors(options => options.AddPolicy("AllowAll",p => p.AllowAnyOrigin()           //Fix API ISSUE
                                                                    .AllowAnyMethod()               //Fix API ISSUE
                                                                     .AllowAnyHeader()));           //Fix API ISSUE


        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app,IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
            {
                HotModuleReplacement = true
            });
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }

        app.UseStaticFiles();

        app.UseCors("AllowAll");        

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",template: "{controller=Home}/{action=Index}/{id?}");

            routes.MapSpaFallbackRoute(
                name: "spa-fallback",defaults: new { controller = "Home",action = "Index" });
        });
    }

我的错误是: – 无法加载http://server/Pages/ApplicationData.aspx/GetApplicationLookups:对预检请求的响应未通过访问控制检查:请求的资源上没有“Access-Control-Allow-Origin”标头.因此不允许原点’http://localhost:60602‘进入.

任何想法,我可能会失踪.

谢谢

解决方法

在向StartUp.cs添加内容时,顺序很重要.

在ConfigureServices函数中,您需要在AddCors调用后进行AddMvc调用.

services.AddCors(options =>
{
    options.AddPolicy("AllowAll",p =>
    {
        p.AllowAnyOrigin()
        .AllowAnyHeader()
        .AllowAnyMethod();
    });
});
...
services.AddMvc(); // must be after AddCors

在Configure函数中,只需使用一个UseCors调用:

app.UseCors("AllowAll");
app.UseMvc();

并且,确保在UseMvc调用之前调用它.

希望这可以帮助.

asp.net – CORS错误 – 请求的资源上没有“Access-Control-Allow-Origin”标头

asp.net – CORS错误 – 请求的资源上没有“Access-Control-Allow-Origin”标头

我使用Angular前端连接到WEB API 2后端.失败的用例如下.当用户注册成功注册后,他们必须登录系统并重定向到新页面以收集更多信息.我正在使用TOKENS进行身份验证.

我在WebAPI配置中启用了CORS:

@H_301_4@var cors = new EnableCorsAttribute("http://localhost:7812","*","*"); config.EnableCors(cors);

注册请求成功,响应头具有所需的CORS头:

@H_301_4@**Access-Control-Allow-Credentials:true Access-Control-Allow-Origin:http://localhost:7812** Content-Length:0 Date:Sun,24 Aug 2014 09:31:55 GMT Server:Microsoft-IIS/8.0 X-Powered-By:ASP.NET X-SourceFiles:=?UTF-8?B?QzpcUHJvamVjdHNcVGVzdgluZ1xNYWx0QXBhcnRtZW50c1xNYWx0YXBhcnRtZW50cy5BUElcTWFsdGFwYXJ0bWVudHMuQVBJXGFwaVxhY2NvdW50XHJlZ2lzdGVy?=

在下一步中,我尝试将用户登录到系统.作为登录的一部分,前端通过请求URL从服务器请求TOKEN:http:// localhost:7802 / token.请求头再次发送一个Origin头Origin:http:// localhost:7812但这次我得到错误:XMLHttpRequest无法加载http:// localhost:7802 / token.请求的资源上不存在“Access-Control-Allow-Origin”标头.因此不允许Origin’http:// localhost:7812’访问.

有人有主意吗?

解决方法

在处理CORS时,我们需要记住,浏览器可能会针对非GET请求发送两个请求.通常有预检(OPTIONS)请求,然后是实际请求(POST).在预检请求期间,服务器需要添加Access-Control-Allow-Origin标头,其值与请求Origin标头匹配.这授权发送后续请求.

对于后续/实际请求,服务器还需要添加Access-Control-Allow-Origin标头.否则,此请求失败.

使用OWIN OAuthAuthorizationServerProvider时,我们需要自定义MatchEndpoint处理程序来管理标头逻辑.此处理程序在验证客户端身份验证之前执

有关更多背景信息,请查看此链接:http://www.ozkary.com/2016/04/web-api-owin-cors-handling-no-access.html

CORS问题-所请求的资源上没有“ Access-Control-Allow-Origin”标头

CORS问题-所请求的资源上没有“ Access-Control-Allow-Origin”标头

如何解决CORS问题-所请求的资源上没有“ Access-Control-Allow-Origin”标头?

CORS的预检请求使用OPTIONS不带凭据的HTTP ,请参阅跨域资源共享:

否则,请发出预检请求。使用方法OPTIONS和以下附加约束,使用引荐来源来源作为覆盖引荐来源,并设置了手动重定向标志和块cookie标志,从起源来源起点获取请求URL:

  • 包括一个Access-Control-Request-Method标头,并将请求方法作为标头字段值(即使是简单方法也是如此)。
  • 如果作者请求标头不为空,则包含一个Access-Control-Request-Headers标头,并以字母顺序将按字母顺序排列的作者请求标头中的标头字段名的列表以逗号分隔,作为标头字段值,每个都转换为ASCII小写(即使是更多是一个简单的标题)。
  • 排除作者请求标头。
  • 排除用户凭据。
  • 排除请求实体主体。

你必须允许HTTP匿名访问OPTIONS。

你修改(简化)的代码:

@Override
protected void configure(HttpSecurity http) throws Exception {
   http
       .authorizeRequests()
           .andMatchers(HttpMethod.OPTIONS, "/**").permitAll()
           .antMatchers("/login").permitAll()
           .anyRequest().fullyAuthenticated()
           .and()
       .httpBasic()
           .and()
       .sessionManagement()
           .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
           .and()
       .csrf().disable();
}

从Spring Security 4.2.0开始,你可以使用内置支持,请参阅Spring Security Reference:

  1. CORS

Spring Framework为CORS提供了一流的支持。必须在Spring Security之前处理CORS,因为飞行前请求将不包含任何cookie(即JSESSIONID)。如果请求不包含任何cookie,并且首先使用Spring Security,则该请求将确定用户未通过身份验证(因为请求中没有cookie),并拒绝该用户。

确保首先处理CORS的最简单方法是使用CorsFilter。用户可以CorsFilter通过CorsConfigurationSource使用以下命令将集成到Spring Security中:

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

  @Override
  protected void configure(HttpSecurity http) throws Exception {
      http
          // by default uses a Bean by the name of corsConfigurationSource
          .cors().and()
          ...
  }

  @Bean
  CorsConfigurationSource corsConfigurationSource() {
      CorsConfiguration configuration = new CorsConfiguration();
      configuration.setAllowedOrigins(Arrays.asList("https://example.com"));
      configuration.setAllowedMethods(Arrays.asList("GET","POST"));
      UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
      source.registerCorsConfiguration("/**", configuration);
      return source;
  }
}

解决方法

我已经创建了两个Web应用程序-客户端和服务应用程序。
当客户端和服务应用程序部署在同一Tomcat实例中时,它们之间的交互就很好。
但是,当将应用程序部署到单独的Tomcat实例(不同的计算机)中时,请求发送服务应用程序时出现以下错误。

Response to preflight request doesn''t pass access control check: No ''Access-Control-Allow-Origin'' header is present on the requested resource. 
Origin ''http://localhost:8080'' is therefore not allowed access. The response had HTTP status code 401

我的客户端应用程序使用JQuery,HTML5和Bootstrap。

如下所示进行AJAX呼叫服务:

var auth = "Basic " + btoa({usname} + ":" + {password});
var service_url = {serviceAppDomainName}/services;

if($("#registrationForm").valid()){
    var formData = JSON.stringify(getFormData(registrationForm));
    $.ajax({
        url: service_url+action,dataType: ''json'',async: false,type: ''POST'',headers:{
            "Authorization":auth
        },contentType: ''application/json'',data: formData,success: function(data){
            //success code
        },error: function( jqXhr,textStatus,errorThrown ){
            alert( errorThrown );
        });
}

我的服务应用程序使用Spring MVC,Spring Data JPA和Spring Security。

我包含了CorsConfiguration如下所示的类:

CORSConfig.java

@Configuration
@EnableWebMvc
public class CORSConfig extends WebMvcConfigurerAdapter  {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("*");
    }
}

SecurityConfig.java:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
@EnableWebSecurity
@ComponentScan(basePackages = "com.services",scopedProxy = ScopedProxyMode.INTERFACES)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    @Qualifier("authenticationService")
    private UserDetailsService userDetailsService;

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService);
        auth.authenticationProvider(authenticationProvider());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
       http
                .authorizeRequests()
                .antMatchers("/login").permitAll()
                .anyRequest().fullyAuthenticated();
        http.httpBasic();
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        http.csrf().disable();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public DaoAuthenticationProvider authenticationProvider() {
        DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
        authenticationProvider.setUserDetailsService(userDetailsService);
        authenticationProvider.setPasswordEncoder(passwordEncoder());
        return authenticationProvider;
    }
}

Spring Security依赖项:

 <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>3.2.3.RELEASE</version>
</dependency>
<dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            <version>3.2.3.RELEASE</version>
</dependency>

我正在使用Apache Tomcat服务器进行部署。

关于React + ASP.NET.Core:所请求的资源上不存在“ Access-Control-Allow-Origin”标头所请求的资源不可用哪里错了的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于AJAX请求获取“所请求的资源上不存在'Access-Control-Allow-Origin'标头”错误、ASP NET CORE – ANGULAR NO’Access-Control-Allow-Origin’标头出现在请求的资源上、asp.net – CORS错误 – 请求的资源上没有“Access-Control-Allow-Origin”标头、CORS问题-所请求的资源上没有“ Access-Control-Allow-Origin”标头的相关信息,请在本站寻找。

本文标签: