0

我从客户那里收到了联合元数据端点,用于在 identityserver3 中配置 WsFederationAuthentication。

从开发人员机器上一切正常,例如身份服务器登录重定向到 adfs 登录页面,但是在将解决方案部署到 AWS 弹性 bean stalk(位于私有子网中)之后,当我尝试通过外部(ADFS)登录时收到 504 HTTP 状态代码登录。

我在邮递员中模拟了这种情况。我在开发人员机器中收到 302 响应,但请求永远不会在 AWS ec2 实例中结束(邮递员结果窗格显示“正在加载...”)。

我能够从 AWS ec2 实例浏览联合元数据 URL 和 /adfs/ls 端点。

在 idnetity 服务器日志中,我可以看到以下日志,

请求提供者的外部登录: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 错误相关的任何事件。

我搜索了上述错误,但解决方案没有针对这个问题产生任何好的结果。

4

1 回答 1

0

我使用进程监控工具进一步调查,比较了本地和 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) 成功登录。

于 2021-06-24T07:13:37.667 回答