使用针对 signalR 端点的不同策略覆盖全局 CORS 策略
Posted
技术标签:
【中文标题】使用针对 signalR 端点的不同策略覆盖全局 CORS 策略【英文标题】:Overriding global CORS policy with a different policy for signalR end point 【发布时间】:2020-08-13 11:08:17 【问题描述】:我有一个适用于所有端点的全局 CORS 策略,但我想为 signalR 集线器端点覆盖此策略。
这是我的 ConfigureServices 方法,它有一个我无法修改的全局 CORS 策略
public void ConfigureServices(IServiceCollection services)
// some piece of code before adding CORS
services.AddCors(o =>
o.AddDefaultPolicy(p =>
p.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod();
);
);
// some piece of code after adding CORS
这里是配置方法
public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider)
app.UseCors();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endPoints =>
endPoints.MapControllers();
endPoints.MapHub<NotificationHub>("/notificationHub")
.RequireCors((builder) =>
builder
.WithOrigins(_configuration.GetValue<string>("Settings:ClientAppUrl"))
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials();
);
);
很明显,我已经覆盖了 /notificationHub 信号的特定端点的 CORS 策略。
在为 /notificationHub/negotiate 添加 CORS 策略之前,我在浏览器中遇到了相同的 CORS 错误
对预检请求的响应未通过访问控制检查:响应中的“Access-Control-Allow->Credentials”标头的值为“”,当请求的凭据模式为>时必须为“true”包括'。 XMLHttpRequest 发起的请求的凭证模式由 >withCredentials 属性控制。
另外请注意,如果我在全局 CORS 策略中添加 AllowCredentials() 方法,那么 signalR 可以正常工作,但我的目标是仅为 signalR 端点添加新的 CORS 策略。
我没有使用 OWIN CORS,它只是 Microsoft.AspNetCore.Cors。
【问题讨论】:
【参考方案1】:我已经找到了解决方法。它很简单,但经常被忽略。
中间件的顺序在这里很重要。通过交换以下两个中间件,我得到了它的工作。
旧
app.UseCors();
app.UseRouting();
新
app.UseRouting();
app.UseCors();
如果有人遇到此问题,请尝试这样做。它肯定会奏效。
来自 Microsoft 的 doc 支持此声明。
【讨论】:
以上是关于使用针对 signalR 端点的不同策略覆盖全局 CORS 策略的主要内容,如果未能解决你的问题,请参考以下文章