微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用 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 可以对所有域开放。所以我正在寻找实现这一要求的建议。

解决方法

尝试仅使用命名策略而不是默认策略。有时它适用于两种情况:


  services.AddCors(o => o.AddPolicy("AllowAnyOrigins",builder =>
            {
               builder.AllowAnyOrigin()
                .AllowAnyHeader()
                .AllowAnyMethod();
        }));


......
......

app.UseCors("AllowAnyOrigins");

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。