OWIN Facebook登录抛出JsonReaderException问题求助
问题分析与解决办法
核心原因
Facebook近期调整了API响应编码策略,默认启用了gzip/deflate压缩,但当前使用的Microsoft.Owin.Security.Facebook(v4.2.2)组件的默认HttpClient未配置自动解压压缩响应的功能。这导致tokenResponse.Content.ReadAsStringAsync()读取到的是压缩后的二进制字节流(而非明文JSON),传入JObject.Parse()时直接触发JSON解析错误。
你用Fiddler能看到有效JSON,是因为Fiddler默认会自动解压压缩响应,终端展示的是明文内容,但代码里读取的是原始压缩数据。
无需替换自定义代码的解决办法
在OWIN启动配置中,为Facebook认证模块的HttpClient添加自动解压处理程序即可:
- 找到项目中
Startup.Auth.cs(或对应OWIN启动配置类)里的Facebook认证配置代码,修改为如下形式:
app.UseFacebookAuthentication(new FacebookAuthenticationOptions { AppId = "你的AppId", AppSecret = "你的AppSecret", BackchannelHttpHandler = new HttpClientHandler { AutomaticDecompression = System.Net.DecompressionMethods.GZip | System.Net.DecompressionMethods.Deflate } });
这段代码为Facebook认证使用的后台HttpClient配置了自动解压gzip/deflate压缩响应的逻辑,确保ReadAsStringAsync()读取到的是可直接解析的明文JSON。
- 重新部署后,Facebook登录流程中获取access_token的响应会被自动解压,
JObject.Parse()可正常解析内容,登录功能即可恢复。
补充说明
- 该方案仅通过配置扩展解决问题,无需修改或替换
FacebookAuthenticationHandler源码,符合“不替换自定义代码”的要求。 - Google登录正常是因为Google API响应未强制启用压缩,或Google认证模块的默认HttpClient已配置自动解压逻辑。
内容的提问来源于stack exchange,提问作者kloarubeek
相关产品推荐
相关产品推荐

