我们有一个用 Asp.Net Core 开发的用户中心系统,这个系统接入第三方登录,并且对公司业务提供 OAuth 授权。
Asp.Net Core 的第三方登录组件都依赖 .Identity.External 和 .AspNetCore.Correlation.* Cookies 保存一些数据。
我们之前偶有遇到因为 Cookies 过大(有些时候 .Identity.External 足有 ~2k 的巨大体积)导致的 404 问题,所以改用 SessionStore 来保存 claims。
- SessionStore 的工作原理是把 claims 存到指定位置并返回一个 key 作为取回 claims 的凭据,然后讲此 key 发送到客户端 Cookie,我们选择使用 DistributedSqlServerCache 来保存这些数据。
自从改用 SessionStore 之后,国内访问就经常遇到 OAuth 中间件报错、取不到 OAuth 用户信息等问题,仔细检查 log 之后发现后端取到的 Cookie 是空的,而数据库中这些数据并没有异常。
国外访问(我们国外使用 Akamai 的 CDN )正常,而通过 Hosts 直接访问源站也没用问题,初步怀疑是国内 CDN 的问题,通过跟踪调试也发现通过国内 CDN 后,后端不能正确取得 SessionStore 的 key,于是导致无法从数据库获取对应 claims。
- 相关问题已提交腾讯云工单,在这里吐槽一下 😂