我正在实现一个简单的负载均衡器 - 它是一个http侦听器,它解析来自浏览器的传入请求并将它们路由到适当的ASP.NET应用程序。它侦听某个端口(8801),并在路由时保留原始URI并仅更改端口号,例如https://machine.domain.com:8801/testsite/Default.aspx可以路由到https://machine.domain.com:8811/testsite/Default.aspx
没有安全路由可以正常工作。当我尝试将WIF联合应用于ASP.NET应用程序时,问题就出现了。我使用ADFS 2.0。以下是我尝试过的两个场景:
方案1
依赖方的WS-Federation被动端点设置为ASP.NET app URI
当通过浏览器访问负载均衡器URI时,负载均衡器路由到ASP.NET应用程序并且页面被加载,但是,来自STS的RequestSecurityTokenResponse被直接重定向到ASP.NET应用程序(而不是负载均衡器),到被动端点设置。所以它可以工作,但由于我希望通过负载均衡器处理ASP.NET应用程序的整个通信,因此这种情况不符合我的要求。
方案2
依赖方的WS-Federation被动端点设置为负载均衡器URI
当通过浏览器访问负载均衡器URI时,负载均衡器路由到ASP.NET应用程序,它返回Unauthorized响应,浏览器重定向到STS,RequestSecurityTokenResponse被重定向回负载均衡器,但是当进一步路由到ASP.NET时应用程序,我得到401的响应 - 未经授权:由于凭据无效,访问被拒绝。这是由于我认为URI不匹配,因为为负载均衡器URI发出了saml令牌。我尝试了各种观众uris和领域的组合,但没有成功。
所以我的问题是,是否存在可以使负载均衡器处理所有必要的联合通信的解决方法,因为我的ASP.NET应用程序只能从负载均衡器访问。
我希望我能够清楚地解释我的问题。
非常感谢 感谢
答案 0 :(得分:1)
最终问题出在其他地方。我的负载均衡器实际上做的是将传入的HttpListenerRequest转换为新的HttpWebRequest,然后将其转发到相应的ASP.NET应用程序。但是,我没有禁用转发请求的自动重定向,因此发生了从ASP.NET应用程序到ADFS的重定向。 这段代码真的很神奇:
HttpWebRequest.AllowAutoRedirect = false;
答案 1 :(得分:0)
在您的依赖方应用程序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