【问题标题】:Cross origin request blocked in asp.net core signalR?跨域请求在asp.net核心signalR中被阻止?
【发布时间】:2019-08-03 23:52:27
【问题描述】:

我正在研究 asp.net 核心 signalR。我想发出跨域请求。我有一个 javascript 客户端,当我将 hubConnection 连接到跨域 signalR 集线器时,会显示以下错误, 从源“https://localhost:44381”访问“https://localhost:44373/chatHub/negotiate?token=12”处的 XMLHttpRequest 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:没有“Access-Control-Allow-Origin”标头出现在请求的资源。

Javascript 客户端代码

var connection = new signalR.HubConnectionBuilder().withUrl("https://localhost:44373/chatHub?token="+12).build();

跨域信号器项目中的启动类

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddCors(options => options.AddPolicy("CorsPolicy", builder =>
    {
        builder
           .AllowAnyMethod()
           .AllowAnyHeader()
           .WithOrigins("*")
           .AllowCredentials();
    }));
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    services.AddCors();
    services.AddSignalR();
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
        app.UseHsts();
    }

    //app.UseCors(builder =>
    //{
    //    builder.WithOrigins("*")
    //       .AllowAnyHeader()
    //       .AllowAnyMethod()
    //       //.WithMethods("GET", "POST")
    //       .AllowCredentials();
    //});

    // ... other middleware ...
   // app.UseCors("CorsPolicy");
    app.UseSignalR(routes =>
    {
        routes.MapHub<ChatHub>("/chatHub");
    });

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();

    app.UseMvc();
}

【问题讨论】:

  • 你有两个services.AddCors电话,有必要吗?
  • 我只使用一个 services.AddCors()
  • 你有两个调用,一个在services.AddMvc().方法的上方和下方。
  • 哦,是的,不,我没有这两个电话

标签: c# asp.net-core asp.net-core-signalr


【解决方案1】:

在您的启动类中取消注释以下行 // app.UseCors("CorsPolicy");

您已经在 ConfigureServices() 方法中构建了策略,现在您需要告诉应用在 Configure() 方法中使用该策略

编辑:

针对您的评论,如果您想在您的 CORS 政策中允许任何来源, 将.WithOrigins("*") 替换为.AllowAnyOrigin()

【讨论】:

  • 但是现在,它给出了以下错误,从源 'localhost:44381' 访问 XMLHttpRequest 在 'localhost:44381' 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:当请求的凭据模式为“包含”时,响应中的“Access-Control-Allow-Origin”标头的值不能是通配符“*”。 XMLHttpRequest 发起的请求的凭证模式由 withCredentials 属性控制。
  • 如您的错误所述。不要在 allowOrigins 中使用通配符。您应该指定允许哪些来源
  • 好的,对于移动客户端我们会怎么做?来源是什么?
  • Origin 将在 Origin 标头下的请求中指定。除非是 web 视图,否则移动设备不会检查 cors。
  • 对于测试阶段的桌面浏览器,请使用 Cors chrome 扩展
猜你喜欢
  • 2021-06-26
  • 2014-10-13
  • 2018-07-31
  • 2019-11-04
  • 2017-02-06
  • 2016-01-29
相关资源
最近更新 更多