我对 使用 WIF 保护流式 WCF net.tcp 服务端点有要求。它应该可以验证来自我们令牌服务器的呼叫。该服务是流式的,因为它的设计目的是传输大量的数据 n 东西。
这似乎是不可能的。如果我不能绕过这个陷阱,我的圣诞节就毁了,我会在阴沟里喝死自己,而快乐的购物者们会踏过我慢慢变冷的身体。我是认真的,伙计们。
为什么这是不可能的? 这是第二十二条军规。
在客户端上,我需要使用从令牌服务器获得的 GenericXmlSecurityToken创建一个通道。没问题。
// people around here hate the Framework Design Guidelines.
var token = Authentication.Current._Token;
var service = base.ChannelFactory.CreateChannelWithIssuedToken(token);
return service.Derp();
我说了“没问题”吗? 问题。事实上,NullReferenceException
风格的问题。
“兄弟,”我问框架,“你到底有没有检查空值?”框架是无声的,所以我拆解后发现
((IChannel)(object)tChannel).
GetProperty<ChannelParameterCollection>().
Add(federatedClientCredentialsParameter);
是异常的来源,并且 GetProperty
调用返回的是 null
。那么,卧槽?结果是,如果我打开 Message security 并将客户端凭据类型设置为 IssuedToken
,那么这个属性现在存在于 ClientFactory
中(提示: 在 IChannel 中没有“ SetProperty”等价物,这个混蛋)。
<binding name="OMGWTFLOL22" transferMode="Streamed" >
<security mode="Message">
<message clientCredentialType="IssuedToken"/>
</security>
</binding>
太好了。不再有 NRE 了。然而,现在我的客户是 出生时就有缺陷(仍然爱他,虽然)。通过深入研究 WCF 的诊断(提示: 让你最大的敌人在粉碎他们并在你面前驾驶他们之后这样做,但在享受他们的妇女和儿童的哀悼之前) ,我发现这是因为服务器和客户端之间的安全不匹配。
“ net.tcp://localhost: 49627/MyService”不支持请求的升级。这可能是由于绑定不匹配造成的(例如,在客户机上启用了安全性,而在服务器上没有)。
查看主持人的对话框(同样是: 碾压,驾驶,阅读日志,享受悲叹) ,我发现这是真的
Protocol Type application/ssl-tls 被发送到不支持该类型升级的服务。
“那么,self,”我说,“我只需要打开主机上的消息安全性!”
结果: 砰。
绑定(‘ NetTcpBinding’,‘ http://tempuri.org/’)支持不能与消息级安全一起配置的流。考虑选择不同的传输模式或选择传输级别的安全性。
我的主机不能同时通过令牌进行流传输和保护第22条军规。
Dr: 如何使用 WIF 保护流式 net.tcp WCF 端点? ? ?