2

我使用过 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 中尝试过绑定,但增加消息的大小不起作用,因为它的标题级别的东西。

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

3 回答 3

2

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

于 2019-06-26T15:51:28.010 回答
2

对于 ASP.NET,如果您的集线器没有高级身份验证(例如基于角色的身份验证),您可以使用以下内容简单地传递一个空声明。

app.MapAzureSignalR(GetType().FullName
                    , options => options.ClaimsProvider = context => new Claim[] {});
于 2019-06-27T06:57:46.033 回答
0

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

如果您的应用确实使用了基于策略/声明的授权,AFAIK 您有两个选项可以解决此问题:

选项 1: 确保您只加载您需要的声明,并且每个声明只包含一次。在我的项目中,我使用了 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 慢),如本答案中所述。

于 2022-02-14T14:57:43.170 回答