Azure AD认证报错Unable to unprotect the message.State多实例部署问题求助
错误根因
Unable to unprotect the message.State报错本质是ASP.NET Core Data Protection 密钥未共享导致的:默认配置下加密密钥仅存储在单实例本地内存或磁盘中,多实例部署时,实例A加密生成的身份认证state参数,被路由到实例B时无法用本地密钥解密,就会触发该错误。单实例运行、开发测试环境无多实例场景,所以不会复现问题。
修复步骤
- 第一步:选择共享密钥存储方案,以下两种是适配Azure App Service Linux容器部署的常用方案:
- 采用Azure Blob存储共享密钥(推荐)
先安装NuGet包:Microsoft.AspNetCore.DataProtection.AzureStorage
提前在Azure中创建存储账户与专用Blob容器,为App Service的托管身份授予该容器的读写权限后,在Startup.cs中添加如下配置:
// 该配置需要放在AddAuthentication代码之前执行 services.AddDataProtection() .SetDefaultKeyLifetime(TimeSpan.FromDays(180)) // 密钥有效期可按需调整 .PersistKeysToAzureBlobStorage( Configuration["DataProtection:BlobConnStr"], "你的Blob容器名称", "dataprotection-keys.xml"); // 若需更高安全级别,可额外配置用Azure Key Vault加密存储的密钥- 若项目已接入Redis缓存,可直接用Redis存储共享密钥
先安装NuGet包:Microsoft.AspNetCore.DataProtection.StackExchangeRedis
添加如下配置:
// 该配置需要放在AddAuthentication代码之前执行 services.AddDataProtection() .PersistKeysToStackExchangeRedis( StackExchange.Redis.ConnectionMultiplexer.Connect(Configuration["RedisConnStr"]), "DataProtection-Keys"); - 采用Azure Blob存储共享密钥(推荐)
- 第二步:配置参数托管
将Blob连接字符串/Redis连接字符串配置到Azure App Service的应用程序配置项中,不要硬编码在代码里。 - 第三步:重启验证
配置完成后重启所有App Service实例即可生效。
内容的提问来源于stack exchange,提问作者agarwal
相关产品推荐
相关产品推荐

