我有角应用程序,最好的朋友写在ASP网络核心,和SignalR集线器.从Angular 应用程序,我想发送请求到BFF端点,它将从Cookie中提取访问令牌,然后将请求重定向到有效的SignalR集线器.

但问题是,当我通过我的好朋友重定向到SignalR集线器时,在成功协商后,我的Angular 应用程序想要与我的好朋友对话,而不是SignalR服务器.

public static async Task<IResult> GetChatHubInfo(HttpContext context, string negotiateVersion, CancellationToken cancellationToken)
{
    var accessToken = context.GetTokenAsync("access_token");

    context.Response.Headers.Authorization = $"Bearer {accessToken}";
    return Results.Redirect($"https://localhost:7271/negotiate?negotiateVersion={negotiateVersion}", preserveMethod: true);
}

推荐答案

我使用的是YARP构建的反向代理.这是我的配置:

  "ReverseProxy": {
    "Routes": {
      "ChatHub": {
        "ClusterId": "ChatHub",
        "Match": {
          "Path": "/api/chathub/{*any}"
        },
        "Transforms": [
          {
            "PathRemovePrefix": "/api/chathub"
          },
          {
            "RequestHeadersCopy": true
          },
          {
            "RequestHeaderOriginalHost": true
          },
          {
            "RequestHeader": "Upgrade",
            "Set": "WebSocket"
          },
          {
            "RequestHeader": "Connection",
            "Set": "Upgrade"
          },
          {
            "RequestHeaderRemove": "Cookie"
          },
          {
            "X-Forwarded": "Set",
            "For": "Append",
            "Proto": "Append",
            "Prefix": "Append",
            "HeaderPrefix": "X-Forwarded-"
          },
        ]
      }
    },
    "Clusters": {
      "ChatHub": {
        "SessionAffinity": {
          "Enabled": true,
          "Policy": "HashCookie",
          "FailurePolicy": "Redistribute",
          "AffinityKeyName": "ChatHubAffinityKey",
          "Cookie": {
            "HttpOnly": true,
            "IsEssential": true,
            "SameSite": "Strict",
            "SecurePolicy": "Always"
          }
        },
        "LoadBalancingPolicy": "PowerOfTwoChoices",
        "Destinations": {
          "ChatHub/Dest1": {
            "Address": "https://localhost:7140"
          },
          "HealthCheck": {
            "Active": {
              "Enabled": true,
              "Interval": "00:00:15",
              "Timeout": "00:00:10",
              "Policy": "ConsecutiveFailures",
              "Path": "/health"
            },
            "Passive": {
              "Enabled": true,
              "Policy": "TransportFailureRate",
              "ReactivationPeriod": "00:00:15"
            }
          }
        }
      }
    }
  }

如你所见,我在代理时删除了每个cookie.我已经编写了在配置代理的位置提取访问令牌的逻辑,如下所示:

services.AddReverseProxy()
    .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"))
    .AddTransforms(builder =>
    {
        builder.AddRequestTransform(async (ctx) =>
        {
            var accessToken = await ctx.HttpContext.GetTokenAsync("access_token");
            ctx.ProxyRequest.Headers.Add("Authorization", $"Bearer {accessToken}");
        });
    });

Csharp相关问答推荐

当MD5被废弃时,如何在Blazor WASM中使用它?

.NET最小API映射将T参数列表为[FromQuery]

在. NET Core 8 Web API中,当为服务总线使用通用消费者时,如何防止IServiceProvider被释放或空?"

XUNIT是否使用测试数据的源生成器?

C#-从基类更新子类

当用户右键单击文本框并单击粘贴时触发什么事件?

共享暂存/生产环境中Azure事件中心的建议配置

如何向事件添加成员

无法将生产环境的AppDbContext设置替换为用于集成测试的内存数据库

Regex字母数字校验

单元测试类型为HttpClient with Microsoft.Extensions.Http.Resilience

JSON串行化程序问题.SQLite中的空值

如何使用EPPlus C#在单个单元格中可视化显示多行文字

错误:此版本的Visual Studio无法打开以下项目

具有嵌套属性的IGGroup

如何在绑定到数据库的datagridview中向上或向下移动行

C#USB条形码 scanner 在第二次扫描时未写入行尾字符

如何使用LINQ在C#中填充列表列表?

使用LibraryImport在多个dll中导入相同的函数

身份验证中间件如何处理多个方案