You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加Ping Federate memberOf属性引发ERR_HTTP2_PROTOCOL_ERROR的求助

解决.NET 6 MVC集成PingOne后因Cookie过大导致的ERR_HTTP2_PROTOCOL_ERROR错误

问题根源很明确:添加memberOf属性后,认证Cookie大小超过了浏览器单个Cookie的4KB限制,同时HTTP2协议对响应帧大小的约束也放大了这个问题。以下是几个可行的解决方案:

  • 精简Cookie中的数据

    • 只保留应用必需的用户组:在PingOne的属性映射配置里过滤掉无关的内置组、非业务组,或者在.NET端验证Token后,只将业务相关的组保留到认证会话中,剔除冗余数据。
    • 移除非必要的用户信息:认证Cookie只存核心身份字段(如用户ID、用户名),其他额外信息通过后端接口按需从PingOne拉取,或者存在内部数据库/缓存里。
  • 用分布式缓存存储会话数据

    • 放弃在Cookie里存大量数据,改用分布式缓存(Redis、SQL Server缓存等)存储用户组这类扩展信息。修改认证配置示例:
      services.AddAuthentication()
          .AddOpenIdConnect("PingOne", options =>
          {
              // 你的PingOne基础配置
              options.SaveTokens = false; // 禁止默认将Token存入Cookie
              options.Events = new OpenIdConnectEvents
              {
                  OnTokenValidated = async context =>
                  {
                      var cache = context.HttpContext.RequestServices.GetRequiredService<IDistributedCache>();
                      // 提取需要的用户组并存入缓存
                      var userGroups = context.Principal.Claims
                          .Where(c => c.Type == "memberOf")
                          .Select(c => c.Value)
                          .ToList();
                      await cache.SetStringAsync(
                          $"UserGroups:{context.Principal.Identity.Name}",
                          JsonSerializer.Serialize(userGroups),
                          new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(8) }
                      );
                  }
              };
          })
          .AddCookie(options =>
          {
              // Cookie只存会话标识,核心身份数据
              options.Cookie.Name = "AppAuthCookie";
          });
      
    • 后续业务逻辑中需要用户组时,直接从分布式缓存读取即可。
  • 启用Cookie自动拆分

    • 如果必须保留部分数据在Cookie中,可通过ASP.NET Core的ChunkedCookieHandler将大Cookie拆分成多个小Cookie,绕过单个Cookie的大小限制:
      services.AddAuthentication()
          .AddCookie(options =>
          {
              options.Cookie.Name = "AppAuth";
              options.Cookie.MaxSize = 4096; // 单Cookie最大4KB
              options.SessionStore = new ChunkedCookieHandler(); // 自动拆分
          });
      
    • 注意:不同浏览器对单域名Cookie总数有限制(一般50个以内),拆分后要控制总数量。
  • 调整HTTP2相关配置

    • 临时切换到HTTP1.1测试:在项目调试设置里关闭"使用HTTP2",如果问题消失,说明是HTTP2帧大小限制导致的。此时可尝试在IIS Express的applicationhost.config中增大HTTP2帧大小:
      <system.webServer>
          <httpProtocol>
              <customHeaders>
                  <add name="Max-Frame-Size" value="32768" /> <!-- 调整为更大的帧大小 -->
              </customHeaders>
          </httpProtocol>
      </system.webServer>
      

内容的提问来源于stack exchange,提问作者Patrick95

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 23:55:16