基于IdentityServer4的Azure多VM应用故障:VM1切换至VM2异常
跨Azure VM部署应用的身份认证切换异常问题排查
问题描述
Web应用部署在Azure两台虚拟机(VM)上,前端配置Application Gateway做负载均衡,出现不对称的切换异常:
- 从VM2登录后停掉VM2,请求自动重定向到VM1,用户无感知,业务正常
- 从VM1登录后停掉VM1,用户被强制登出并跳转至VM2登录页;输入凭据登录后应用持续加载,API返回401状态码
已实现Data Protection组件,使用IdentityServer4做身份认证,日志报错如下:
2023-05-18 09:34:14,587 [138] ERROR [IdentityModel.AspNetCore.OAuth2Introspection.OAuth2IntrospectionHandler] [Error returned from introspection endpoint: Not Found] - Error returned from introspection endpoint: Not Found 2023-05-18 09:34:14,588 [138] INFO [IdentityModel.AspNetCore.OAuth2Introspection.OAuth2IntrospectionHandler] [BearerIdentityServerAuthenticationIntrospection was not authenticated. Failure message: Error returned from introspection endpoint: Not Found] - BearerIdentityServerAuthenticationIntrospection was not authenticated. Failure message: Error returned from introspection endpoint: Not Found
另外,打印用户的subjectId和email声明均为null值。
核心排查与解决方向
1. 统一IdentityServer4端点配置
检查两台VM的IdentityServer4客户端配置,重点确认IntrospectionEndpoint地址:
- 若VM1将自省端点指向自身(如
http://vm1.internal/connect/introspect),VM2配置为网关统一地址,当VM1停掉后,VM2无法访问VM1的私有端点就会触发Not Found错误 - 所有VM的IdentityServer4端点需统一配置为Application Gateway的公共/内部地址,避免绑定单个VM的私有地址
2. 验证Data Protection密钥同步
虽已实现Data Protection,但需确认密钥共享配置的一致性:
- 检查是否使用Azure Blob Storage、SQL Server等共享存储保存加密密钥,确保两台VM的连接字符串、容器名称、密钥存储路径完全一致
- 测试VM1生成的加密Cookie能否在VM2上正常解密,这是跨VM会话保持的核心前提
- 可手动触发密钥同步,或重启两台VM的Data Protection服务组件
3. 检查Application Gateway会话配置
- 确认会话亲和性设置:若启用基于客户端IP的亲和性,VM1停掉后客户端流量强制路由到VM2时,原有加密Cookie可能无法被正确解析;需将会话亲和性绑定到应用的会话Cookie(如
.AspNetCore.Identity.Application) - 验证健康探测规则:确保VM1停掉后能被网关及时标记为不健康,避免流量误转发
4. 排查VM2的令牌验证逻辑
- 检查VM2的网络策略:确认允许出站访问IdentityServer4的自省端点(包括端口、防火墙规则)
- 对比两台VM的OAuth2自省中间件配置:确保客户端ID、客户端密钥、端点地址等参数完全一致
内容的提问来源于stack exchange,提问作者Tarannum Shaikh
相关产品推荐
相关产品推荐

