我使用过Azure SignalR服务。它可以很好的测试项目,但当我嵌入到我的真实项目。它抛出错误(访问令牌不能超过4K)。
访问令牌不得超过4K。413请求实体太大
我们在我们的项目中使用SignalR,现在我们转向Azure SignalR服务。我做了一个测试项目,在这里我使用了Azure SignalR服务,它在那里工作得很好,但是我将它嵌入到我的实际项目中,它会引发错误(访问令牌不能超过4K)。我在IIS和web.config级别尝试过不同的解决方案,增加消息的大小,但是没有效果。我已经检查过我的饼干尺寸小于1k了。无法完成Azure SignalR服务连接的制作。为什么它能在测试项目中工作。意思是它包括曲奇和声明,从页面存在于我的网页上,以防止真实的项目。
我得到了这个东西,但是它在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>发布于 2019-06-27 06:57:46
对于ASP.NET,如果集线器没有高级身份验证(例如基于角色的身份验证),您可以使用以下方法简单地通过一个空的声明。
app.MapAzureSignalR(GetType().FullName
, options => options.ClaimsProvider = context => new Claim[] {});发布于 2019-06-26 15:51:28
我知道原因了。它的索赔问题。我有很多关于我的真实项目的索赔,因为它们的大小,我的要求超过了4k的限制。我使用了压缩,一切都很好。谢谢
发布于 2022-02-14 14:57:43
在将角色声明添加到我的应用程序( .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慢,正如在这个答案中解释的那样。
https://stackoverflow.com/questions/56769490
复制相似问题