使用 Ocelot 为 Web 套接字连接设置 CORS 策略

问题描述

我在 .net core 中使用 ocelot 实现了一个 API 网关。网关重定向所有 API,包括 Web 套接字连接。

显示 Web 套接字重定向的 ocelot json 示例。

{
            "DownstreamPathTemplate": "/notification/{url}","DownstreamScheme": "ws","DownstreamHostAndPorts": [
                {
                    "Host": "localhost","Port": "8082"
                }
            ],"UpstreamPathTemplate": "/notification/{url}","Key": "","UpstreamHttpMethod": [ "Get","Post","Options" ],"Priority": 0


}

我还有一个 CORS 政策,基本上允许所有来源。

services.AddCors(o =>
            {
                o.AddDefaultPolicy(p =>
                {
                    p.AllowAnyOrigin()
                    .AllowAnyMethod()
                    .AllowAnyHeader();
                });
            });

这里的挑战是 web socket/signalR 连接强制要求只允许特定来源而不是全部。如果我这样做,这会起作用。

services.AddCors(o =>
            {
                o.AddDefaultPolicy(p =>
                {
                    p.WithOrigins("http://localhost:4200")
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials();
                });
            });

但我不想让它成为默认策略。我只想要仅用于 signalR 的附加策略,我可以完成类似的代码来实现单独的策略。

services.AddCors(o =>
            {
                o.AddDefaultPolicy(p =>
                {
                    p.AllowAnyOrigin()
                    .AllowAnyMethod()
                    .AllowAnyHeader();
                });

                o.AddPolicy("customPolicy",p =>
                {
                    p.WithOrigins("http://localhost:4200")
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials();
                });
            });

这添加了一个默认策略和一个命名策略,但我如何告诉我的 websocket/signalR 连接使用命名策略而不是默认策略?

这是我的配置方法。

public async void Configure(IApplicationBuilder app,IWebHostEnvironment env)
        {
            app.UseCors();

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseAuthentication();
            app.UseWebSockets();
            await app.UseOcelot().ConfigureAwait(false);
        }

因此,我需要建议将此自定义策略仅与 Web 套接字连接相关联。 简而言之,以下是我的要求。

SignalR => 命名策略(允许特定来源)

Http => 默认策略(允许所有来源)

要求只为特定域启用 Web 套接字,而 Http 可以对所有域开放。所以我正在寻找实现这一要求的建议。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)