来自身份服务器 3 的外部登录(通过 ADFS)响应 http 状态代码 504
Posted
技术标签:
【中文标题】来自身份服务器 3 的外部登录(通过 ADFS)响应 http 状态代码 504【英文标题】:External login (via ADFS) from identity server3 responds with http status code 504 【发布时间】:2021-09-05 21:18:32 【问题描述】:我从客户那里收到了联合元数据端点,用于在 identityserver3 中配置 WsFederationAuthentication。
从开发人员机器上一切正常,例如身份服务器登录重定向到 adfs 登录页面,但是在将解决方案部署到 AWS 弹性 bean stalk(位于私有子网中)之后,当我尝试通过外部登录时收到 504 HTTP 状态代码(ADFS) 登录。
我在邮递员中模拟了这种情况。我在开发人员机器中收到 302 响应,但请求永远不会在 AWS ec2 实例中结束(邮递员结果窗格显示“正在加载...”)。
我能够从 AWS ec2 实例浏览联合元数据 URL 和 /adfs/ls 端点。
在身份服务器日志中,我可以看到以下日志,
请求提供者的外部登录:adfs
触发外部身份提供者的质询
HTTP 响应
"StatusCode": 401, "Headers": "Content-Type": [ "text/html" ], "Server": [ "Microsoft-IIS/10.0" ], "Content-Length": [ "0" ] , "Body": ""
在此之后,网关超时(通过 AWS 负载均衡器)。
根据 Microsoft.Owin.Security.WsFederation.WsFederationAuthenticationHandler.cs 中的代码,来自 ApplyResponseChallengeAsync() 方法的重定向响应应生成带有 adfs 登录页面 URL 的位置标头。 但是,这并没有发生。
我在 HTTPError.Log 中看到以下错误。
GET /identity/external?provider=adfs&signin=699036641a8b2b6ddccea61bc8c1f715 -- 1 Connection_Abandoned_By_ReqQueue DefaultAppPool
我在事件查看器日志中没有看到与上述 HTTP 错误相关的任何事件。
我搜索了上述错误,但解决方案没有针对这个问题产生任何好的结果。
【问题讨论】:
【参考方案1】:我使用进程监控工具进一步调查,比较了本地和 aws ec2 实例之间的 tcp 操作以获取 identityserver 外部登录端点请求,然后我发现 TCP 断开操作在 AWS ec2 实例中的 TCP 连接后立即发生,但在本地这不是而是发生了 TCP 通信建立并且 tcp 通信进行得很好。
使用wireshark 工具进一步调查,然后我发现在客户端Hello 调用后AWS ec2 实例中发生握手失败。然后我比较了本地机器使用的TLS版本和密码套件(来自wireshark日志),我发现本地机器使用TLS 1.2和密码套件的区别:TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384(0xc030)
AWS ec2 实例使用 ADFS 服务器不支持的 TLS 1.0。因此无法建立 tcp 连接,导致握手失败。
我点击此链接https://docs.microsoft.com/en-us/officeonlineserver/enable-tls-1-1-and-tls-1-2-support-in-office-online-server#enable-strong-cryptography-in-net-framework-45-or-higher 使 .net 框架使用强加密。
在此注册表更新后,可以通过身份服务器3 登录页面从外部 idp (ADFS) 成功登录。
【讨论】:
以上是关于来自身份服务器 3 的外部登录(通过 ADFS)响应 http 状态代码 504的主要内容,如果未能解决你的问题,请参考以下文章
使用 ADFS 对 ASP.NET Web Api 进行身份验证