我从客户那里收到了联盟元数据端点,我用来在identityserver3中配置WsFederationAuthentication。
从身份服务器登录重定向到adfs登录页面的开发人员机器,一切都很好,但在将解决方案部署到AWS弹性豆茎(位于私有子网中(后,当我尝试通过外部(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中的代码,从ApplyResponseChallengeSync((方法,重定向响应应使用具有adfs登录页URL的位置标头生成。但是,这并没有发生。
我在HTTPError.Log.中看到以下错误
GET /identity/external?provider=adfs&signin=699036641a8b2b6ddccea61bc8c1f715 -- 1 Connection_Abandoned_By_ReqQueue DefaultAppPool
我在事件查看器日志中没有看到任何与上述HTTP错误相关的事件。
我搜索了上面的错误,但解决方案没有为这个问题产生任何好的结果。
我使用进程监控工具进行了进一步的调查,比较了本地和aws ec2实例之间针对identityserver外部登录端点请求的tcp操作,然后我发现在aws ec2实例中tcp连接后立即发生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://learn.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 framewrok可以使用强加密。
此注册表更新后,可以通过身份服务器3登录页面从外部idp(ADFS(成功登录。