将SAML2令牌与WCF channelfactory和Weblogic服务一起使用

将SAML2令牌与WCF channelfactory和Weblogic服务一起使用,wcf,wif,adfs2.0,saml-2.0,wse,Wcf,Wif,Adfs2.0,Saml 2.0,Wse,救命!:)我在尝试让以下内容正常工作时遇到了无数问题(如果我没有使用准确的术语,请提前道歉):) 我需要一个.NET web应用程序(客户端)与使用SAML2策略保护的Weblogic web服务通信。有一些限制,我需要使用.NET3.5/4,因此我使用WIF(带扩展)来处理配置为生成SAML2令牌的ADFS2 到目前为止,网站->adfs2->SAML2令牌位运行良好-我肯定能通过它获得令牌 附加(1)-Weblogic服务必须使用SAML2策略来实现发送方担保确认方法,尽管ADFS 2默认提

救命!:)我在尝试让以下内容正常工作时遇到了无数问题(如果我没有使用准确的术语,请提前道歉):)

我需要一个.NET web应用程序(客户端)与使用SAML2策略保护的Weblogic web服务通信。有一些限制,我需要使用.NET3.5/4,因此我使用WIF(带扩展)来处理配置为生成SAML2令牌的ADFS2

到目前为止,网站->adfs2->SAML2令牌位运行良好-我肯定能通过它获得令牌

附加(1)-Weblogic服务必须使用SAML2策略来实现发送方担保确认方法,尽管ADFS 2默认提供了承载方,但在我们将令牌通过线路发送到服务之前,我能够操纵SAML断言

另外(2)-由于许多原因,无法通过SSL访问Web服务,basicHTTPBinding是我唯一的选择

现在问题来了。。我只是无法以这样的方式与Weblogic通信,以便在请求中发送令牌(任何记录的尝试都会返回oracle“常规Web服务安全错误”,因为请求中没有有效的安全标头)。首选方法是通过WCF,使用通道工厂-下面的代码是我尝试过的一个粗略示例-ClaimSideEntity/token内容取自WIF扩展内容附带的代码示例:

IClaimsIdentity identity = Thread.CurrentPrincipal.Identity as IClaimsIdentity;
Saml2SecurityToken token = identity.BootstrapToken as Saml2SecurityToken;

BasicHttpBinding binding = new BasicHttpBinding();
binding.Security.Mode = BasicHttpSecurityMode.None;
binding.Security.Transport.ClientCredentialType = HttpClientCredntialType.None;

EndpointAddress address = new EndpointAddress("http://someaddress");

ChannelFactory<weblogicService.MyService> factory = new ChannelFactory<weblogicService.MyService>(binding,address);

factory.ConfigureChannelFactory<weblogicService.MyService>();
factory.Credentials.SupportInteractive = false;
weblogicService.MyService proxy = factory.CreateChannelWithIssuedToken<weblogicService.MyService>(token)
proxy.DoSomething();
IClaimsIdentity identity=Thread.CurrentPrincipal.identity作为IClaimsIdentity;
Saml2SecurityToken token=identity.BootstrapToken作为Saml2SecurityToken;
BasicHttpBinding=新的BasicHttpBinding();
binding.Security.Mode=BasicHttpSecurityMode.None;
binding.Security.Transport.ClientCredentialType=HttpClientCredentialType.None;
EndpointAddress地址=新的EndpointAddress(“http://someaddress");
ChannelFactory工厂=新的ChannelFactory(绑定,地址);
ConfigureChannelFactory();
factory.Credentials.SupportInteractive=false;
weblogicService.MyService proxy=factory.CreateChannelWithIssuedToken(令牌)
proxy.DoSomething();
以下帖子(以及我能找到的其他地方)给出了答案:

…这正是我正在做的-但无论是通过WireShark查看流量,还是通过实施customer MessageInspector并查看“BeforeSendRequest”中的请求,我都看不到令牌的任何迹象(因此请求被拒绝)

另外,无论我是操纵令牌以包含发送方凭证,还是让它保持原样,这都无关紧要

附加(3):如果我不使用ADFS2/SAML/WIF/WCF等,我已经能够成功地与Weblogic服务进行通信。但是,通过更基本的WSE2.0/3.0 web引用方法(即创建SoapRequest、用户名令牌等)

问题在于,在没有用户交互的情况下提供有效的用户名和密码。换句话说,保持“SSO方法”,而不必每次都实现表单身份验证(或等效身份验证)来获取用户凭据。。似乎也没有任何明显的方式将ADFS生成的SecurityToken与WSE一起使用

有人能帮忙解释一下吗?为什么带有所提供令牌的WCF通道工厂方法根本不起作用,即调试时没有有效令牌的迹象,当然Weblogic也没有收到有效的SAML令牌


我还研究了CustomMessageEncoder路由,并以这种方式将SAML断言添加到SOAP头中。。但据我所知,这真的不应该这么难。WCF中有什么东西被破坏了吗?

端点绑定限制(basicHTTP)不支持SAML2 afaik,而且ADFS2.0似乎只提供承载令牌,并且在事实发生后修改令牌也是不可能的(WIF中建议的用于执行此操作的覆盖似乎没有按预期工作),最后,因为web服务不支持https,安全模式为none(这是唯一可以使用的安全模式)意味着无论如何都不会发送令牌。。啊,好吧,回到绘图板上来

你好,麦克。关于您的第三点(附加(3)),也许我可以建议您这样做:如果您可以在.NET客户端中获取用户凭据,请通过“Authorization:Basic encodedCredentials”头将其包含在HTTP请求中。我知道这不是最好的方法,但是…嗨,谢谢你的回复。由于需要避免用户在登录网站时输入其凭据,因此附加(3)实际上是最后的手段。真正让人头疼的是SAML2/Channelfactory方法应该是有效的,但它不是:(也许我可以使用其他basicHTTP绑定设置或自定义行为,但我不确定它们是否合适,这似乎是导致我的问题的多个因素的组合。其中最重要的是目标web服务的配置施加的限制,目前无法更改这些限制-返回drawing板;)