我正在实现一个简单的负载均衡器——它是一个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应用URI
当通过浏览器访问负载平衡器URI时,负载平衡器会路由到ASP.NET应用程序并加载页面,但是,根据被动端点设置,STS的RequestSecurityTokenResponse会直接重定向到ASP.NET应用(而不是负载平衡器)。所以它是有效的,但由于我希望通过负载均衡器处理与ASP.NET应用程序的整个通信,所以这种情况不符合我的要求。
场景2
依赖方的WS-Federation被动端点设置为负载平衡器URI
当通过浏览器访问负载平衡器URI时,负载平衡器路由到ASP.NET应用程序,该应用程序返回Unauthorized响应,浏览器重定向到STS,RequestSecurityTokenResponse重定向回负载平衡器,但当进一步路由到ASP.NET应用程序时,我得到401-Unauthorized:由于凭据无效,访问被拒绝。我认为这是由于URI不匹配,因为saml令牌是为负载均衡器URI颁发的。我尝试了各种观众uri和realms的组合,但没有成功。
因此,我的问题是,是否存在一种变通方法,使负载平衡器能够处理所有必要的联合通信,因为我的ASP.NET应用程序只能从负载平衡器访问。
我希望我把我的问题解释得足够清楚。
非常感谢您的帮助感谢
最终问题出在了其他地方。我的负载均衡器实际做的是将传入的HttpListenerRequest转换为新的HttpWebRequest,然后将其转发到相应的ASP.NET应用程序。然而,我没有对转发的请求禁用自动重定向,因此发生了从ASP.NET应用程序到ADFS的重定向。这个代码发挥了神奇的作用:
HttpWebRequest.AllowAutoRedirect=false;
在依赖方应用程序web.config中,您能否确认您的联邦身份验证部分如下所示(下面的领域应该指定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