You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

指定身份账户下,ALB负载均衡IIS应用跨服务器认证失效

问题分析与解决方案

问题场景

  • AWS环境下两台IIS服务器部署ASP.NET MVC应用,会话状态存储于SQL Server,前端配置AWS Application Load Balancer(ALB)
  • 应用池使用NetworkService身份时,跨服务器会话共享正常;改用具备管理员权限且加入IIS_IUSRS组的本地账户后,认证Cookie无法跨服务器识别,用户完成认证后请求路由到另一台服务器时,会话状态无法恢复
  • 两台服务器的sessionState配置完全一致,示例配置:
<sessionState mode="SQLServer" cookieName="ASP.NET_SessionId_4344" allowCustomSqlDatabase="true" sqlConnectionString="...connection string with dbuser and password..." cookieless="false" timeout="20" />

核心原因

问题并非源于SQL Server会话存储的权限,而是ASP.NET机器密钥(machineKey)的一致性:

  • 当IIS应用池使用内置账户(如NetworkService)时,Windows服务器的内置账户SID是全局统一的,ASP.NET自动生成的machineKey会基于该SID,因此两台服务器的machineKey默认一致,能正常解密/验证跨服务器的认证Cookie
  • 改用本地账户时,本地账户的SID是服务器独有的,ASP.NET自动生成的machineKey会基于该账户SID,导致两台服务器的machineKey不一致——另一台服务器无法解密由第一台服务器加密的认证Cookie,从而无法识别会话

解决步骤

  1. 统一配置两台服务器的machineKey
    在两台服务器的web.config文件的<system.web>节点下,添加完全相同的machineKey配置,覆盖自动生成的密钥:

    <machineKey validationKey="生成的验证密钥" decryptionKey="生成的解密密钥" validation="SHA1" decryption="AES" />
    

    (可通过ASP.NET代码System.Web.Security.MachineKey.GenerateKey()生成安全的密钥,确保两台服务器的密钥完全一致)

  2. 确认会话配置一致性
    再次核对两台服务器sessionState节点的cookieName、timeout等参数,确保完全匹配(已确认一致可跳过)

  3. 重启应用池生效
    重启两台服务器的IIS应用池,使新的machineKey配置生效

内容的提问来源于stack exchange,提问作者Marc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 16:12:42