2012-03-22 43 views
0

我实现一个简单的负载均衡器自定义负载平衡器 - 这是一个HTTP监听器,解析来自浏览器,并将其发送到相应的ASP.NET应用程序的传入请求。它监听某个端口(8801),并在路由时保留原始URI并仅改变端口号码,例如, https://machine.domain.com:8801/testsite/Default.aspx可以被路由到https://machine.domain.com:8811/testsite/Default.aspxWIF被动联合会与地方

没有安全路由工作得很好。当我尝试将WIF联合应用到ASP.NET应用程序时,问题就出现了。我使用ADFS 2.0。这里有两种情况我想:

场景1

依赖方的WS联盟无源端点设置为ASP.NET应用程序的URI

当负载平衡器URI是通过浏览器访问,负载平衡器路由到ASP.NET应用程序和页面被加载,但是,根据设置的被动端点,来自STS的RequestSecurityTokenResponse会直接重定向到ASP.NET应用程序(而不是负载平衡器)。所以它可以工作,但由于我希望通过负载平衡器处理整个ASP.NET应用程序的通信,所以这种情况不符合我的要求。

方案2

依赖方的WS联盟无源端点设置为负载平衡器URI

当负载平衡器URI是通过浏览器访问,负载平衡器路由到ASP.NET应用程序,它返回未经授权响应,浏览器重定向到STS,RequestSecurityTokenResponse被重定向回负载均衡器,但是当进一步路由到ASP.NET应用程序时,我得到401响应 - 未经授权:由于凭据无效,访问被拒绝。这是由于我认为URI不匹配,因为saml令牌是为负载平衡器URI发布的。我尝试了听众uris和领域的各种组合,但没有成功。

所以我的问题是,是否存在一个解决办法,这将使负载均衡器处理所有必要联合会沟通,我的ASP.NET应用程序只能从负载均衡器进行访问。

我希望我能够清楚地解释我的问题。

帮助非常感谢 感谢

回答

1

最终的问题是其他地方。我的负载均衡器实际上做的是将传入的HttpListenerRequest转换为新的HttpWebRequest,然后将其转发给相应的ASP.NET应用程序。但是,我并未禁用已转发请求上的自动重定向,因此发生了从ASP.NET应用程序到ADFS的重定向。 此代码确实具有神奇功效:

HttpWebRequest。AllowAutoRedirect = false;

+0

出于好奇,你在哪里把这段代码放在你的解决方案中? – shenn 2014-05-21 21:28:39

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

+0

欢呼的队友,最后RsaEncryptionCookieTransform没有必要,多亏了 – vvega 2012-03-28 11:44:46