ASP.NET Core站点部署后Post/授权操作出现Antiforgery令牌解密错误
问题原因及修复方案
你遇到的报错核心有两个诱因,你怀疑的配置顺序问题确实存在,同时还有数据保护密钥的存储问题:
1 现有配置错误点
1.1 中间件顺序错误
你当前Configure方法里的CORS中间件放置位置错误,CORS必须在认证、授权中间件之前执行,否则跨域请求会被提前拦截,同时也会干扰防伪令牌的验证流程。
当前错误顺序:
app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseCors("global");
修正后顺序:
app.UseRouting(); // CORS必须放在认证授权之前 app.UseCors("global"); app.UseAuthentication(); app.UseAuthorization();
1.2 数据保护密钥未配置持久化
默认情况下ASP.NET Core的数据保护密钥是存储在进程内存中的,只要应用重启、更换部署实例、容器重建,密钥就会丢失,此时之前生成的防伪令牌、身份认证Cookie都无法解密,就是你日志里The key {key} was not found in the key ring报错的直接原因。
2 修复步骤
2.1 调整中间件顺序
按照上述1.1的要求调整Configure方法里的中间件顺序即可。
2.2 配置数据保护密钥持久化
你可以根据部署场景选择密钥存储位置,比如存储到本地文件的配置示例:
// 引用命名空间 using System.IO; using Microsoft.AspNetCore.DataProtection; services.AddDataProtection() // 替换为实际有权限读写的目录路径 .PersistKeysToFileSystem(new DirectoryInfo(@"/app/data/keyring")) // 应用名固定,不要随意修改,否则多实例部署时密钥无法通用 .SetApplicationName("你的站点唯一标识名");
如果是多实例部署,也可以选择将密钥存储到数据库、共享存储或者云密钥管理服务中。
2.3 可选优化
你代码中services.AddIdentity调用已经默认注册了认证服务,重复的services.AddAuthentication()可以删除,不影响功能但可以减少冗余注册。
3 部署后注意事项
修复后首次上线时,老用户浏览器中存储的旧Cookie是用之前丢失的密钥加密的,会继续报错,引导用户清除站点Cookie或者等待旧Cookie过期即可恢复正常。
内容的提问来源于stack exchange,提问作者wdafoe666
相关产品推荐
相关产品推荐

