我正在实现一个简单的负载均衡器-它是一个http侦听器,它解析来自浏览器的传入请求,并将它们路由到适当的ASP.NET应用程序。它监听某个端口(8801),并且在路由时,它保留原始URI并仅更改端口号,例如,可以将https://machine.domain.com:8801/testsite/Default.aspx路由到https://machine.domain.com:8811/testsite/Default.aspx
在没有安全性的情况下,路由工作得很好。当我尝试将WIF联合应用到ASP.NET应用程序时,这个问题出现了。我使用ADFS2.0。下面是我尝试过的两个场景:
场景1
依赖方的WS联合被动终结点设置为ASP.NET应用程序URI
当通过浏览器访问负载均衡器URI时,负载均衡器将路由到ASP.NET应用程序并加载页面,但是,根据设置的被动端点,来自STS的RequestSecurityTokenResponse将直接重定向到ASP.NET应用程序(而不是负载均衡器)。所以它是有效的,但由于我希望通过负载均衡器来处理与ASP.NET应用程序的整个通信,所以这个场景不符合我的要求。
场景2
依赖方的WS-Federation被动终结点设置为负载平衡器URI
当通过浏览器访问负载均衡器URI时,负载均衡器路由到ASP.NET应用程序,该应用程序返回未经授权的响应,浏览器重定向到STS,RequestSecurityTokenResponse被重定向回负载均衡器,但当进一步路由到ASP.NET应用程序时,我得到响应401 -未授权:由于无效凭据而拒绝访问。我认为这是由于URI不匹配造成的,因为saml令牌是为负载均衡器URI颁发的。我尝试了受众uris和领域的各种组合,但没有成功。
因此,我的问题是,是否存在一个变通方法,使负载均衡器能够处理所有必要的联盟通信,因为我的ASP.NET应用程序只能从负载均衡器访问。
我希望我已经足够清楚地解释了我的问题。
非常感谢你的帮助,谢谢
发布于 2012-03-28 19:43:04
最终问题出在别的地方。我的负载均衡器实际做的是将传入的HttpListenerRequest转换为新的HttpWebRequest,然后将其转发到适当的ASP.NET应用程序。然而,我没有在转发的请求上禁用自动重定向,所以会发生从ASP.NET应用程序到ADFS的重定向。下面的代码实现了这个魔术:
HttpWebRequest.AllowAutoRedirect = false;
发布于 2012-03-23 06:06:38
在您的依赖方应用程序web.config中,您能否确认您的federatedAuthentication部分如下所示(下面的领域应指定您的NLB端口):
<federatedAuthentication>
<wsFederation passiveRedirectEnabled="true" issuer="https://mysts.com/v2/wsfederation" realm="https://machine.domain.com:8801/testsite/Default.aspx" requireHttps="false" />
<cookieHandler requireSsl="false" />
</federatedAuthentication>另外,您应该注意的另一个问题是会话cookie。WIF默认使用DPAPI对其进行加密,因此您必须改用RsaEncryptionCookieTransform。在Azure中使用WIF时也存在同样的问题。这里有一篇文章演示了如何做到这一点:
http://msdn.microsoft.com/en-us/library/windowsazure/hh289318.aspx
https://stackoverflow.com/questions/9824107
复制相似问题