来自身份服务器 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 进行身份验证

Office 365 身份验证和单一登录部署

Office365混合部署进阶系列教程四:ADFS联合身份认证

IdentityServer4 ADFS 外部不返回角色

带有 ADFS 的 AWS Cognito:颁发者与 providerName 不匹配