AccessToken 不能超过 4K

AccessToken must not be longer than 4K

我使用过 Azure SignalR 服务。它适用于测试项目,但当我嵌入到我的真实项目中时。它抛出错误(访问令牌不得超过 4K)。

访问令牌不得超过 4K。 413 请求实体太大

我们在我们的项目中使用 SignalR,现在我们正在转向 Azure SignalR 服务。 我做了一个测试项目,我在其中使用了 Azure SignalR 服务,它在那里工作正常,但我将其嵌入到我的真实项目中时它会抛出错误(访问令牌不得超过 4K)。 我在 IIS 和 web.config 级别尝试了不同的解决方案,增加消息的大小之类的事情,但没有任何效果。 我检查过我的 cookie 大小小于 1k。 无法建立 Azure SignalR 服务连接。 为什么它在测试项目中有效。意思是在真实项目的情况下,它包括来自我页面上存在的页面的 cookie 和声明。

我得到了这个东西,但它在 Asp.net 中不起作用,因为它是核心示例。

services.AddSignalR()
        .AddAzureSignalR(options =>
            {
                options.ClaimsProvider = context => context.User.Claims;
            });

我已经尝试在 web.config 中进行绑定,但是增加消息的大小不起作用,因为它是 header 级别的东西。

<bindings>
      <basicHttpBinding>
        <binding name="basicHttpBinding" maxReceivedMessageSize="524288000"/>
        <binding name="mexHttpBinding" maxReceivedMessageSize="524288000" />
      </basicHttpBinding>
</bindings>

我明白了。 它的索赔问题。我的实际项目有很多索赔,因为它们的大小我的请求超过了 4k 限制。 我使用了压缩,对我来说一切正常。 谢谢

对于ASP.NET,如果您的 Hub 没有高级身份验证(例如基于角色的身份验证),您可以使用以下命令简单地通过空声明。

app.MapAzureSignalR(GetType().FullName
                    , options => options.ClaimsProvider = context => new Claim[] {});

将角色声明添加到我的应用程序(Blazor Server .NET 6,带有 Azure SignalR)后 - 我 运行 遇到了这个问题。

如果您的应用确实使用了基于 Policy/Claim 的授权,据我所知,您有两种选择来解决此问题:

选项 1: Ensure that you are only loading the claims that you need,并且每个声明只包含一次。在我的项目中,我使用了 RoleClaims。当两个角色具有相同的声明,并且用户分配了两个角色时,声明将再次添加到访问令牌中。在我的项目中,当我简单地过滤所有声明以仅包含不同的声明(按值)时,问题得到了解决:

我的例子:在Startup.cs

services.AddSignalR()
        .AddAzureSignalR(options =>
            {
                // include only necessary claims
                  options.ClaimsProvider = context => context.User.Claims.ToList().DistinctBy(d => d.Value);
            });

选项 2:

如果您的访问令牌在过滤后仍然太长(选项 1)- 您可以加载并检查每个请求的声明(但是,根据我的经验,这比选项 1 慢),如 [=12] 中所述=].