我有一个带有 2 个端点的旧 WCF 服务。一个端点是使用 basicHttpBinding 配置的,它工作正常。我想将另一个端点配置为使用 wsHttpBinding 并将安全模式设置为 TransportWithMessageCredentials 以便我可以使用以下方法读取用户名:
string UserName = ServiceSecurityContext.Current.PrimaryIdentity.Name;
协议必须是 HTTP,并且不能使用安全的 HTTPS。我找到了与此问题类似的答案并尝试实现它。这是 web.config 文件:
<bindings>
<basicHttpBinding>
<binding name="myBindingConfiguration1" closeTimeout="00:01:00">
<security mode="None">
<transport clientCredentialType="None" />
</security>
</binding>
</basicHttpBinding>
<wsHttpBinding>
<binding name="SecureServiceEndpoint" closeTimeout="00:01:00">
<security mode="None">
</security>
</binding>
</wsHttpBinding>
<customBinding>
<binding name="HttpWithAuthentication">
<security authenticationMode="UserNameOverTransport" allowInsecureTransport="true" />
<context />
<!-- needed for durable worklfows -->
<textMessageEncoding messageVersion="Soap12Addressing10" />
<httpTransport />
</binding>
</customBinding>
</bindings>
<services>
<service behaviorConfiguration="ServiceBehavior" name="Service.Service">
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<endpoint address="insecure" binding="basicHttpBinding" bindingConfiguration="myBindingConfiguration1"
name="InsecureService" contract="Service.IService" />
<endpoint address="secure" binding="customBinding" bindingConfiguration="HttpWithAuthentication"
name="SecureService" contract="Service.ISecureService" />
</service>
</services>
当我尝试更新服务引用时,我收到错误消息:messageVersion="Soap12Addressing10" 不是类型的有效实例。
根据 MS 文档,这是一个有效的类型。这个属性应该是什么消息版本?
我尝试删除此属性并且可以更新服务引用,但是在访问安全端点时,客户端应用程序抛出异常:“提供的 URI 方案 'http' 无效;预期为 'https'。\r\n参数名称:通过” .
我在文档中读到不推荐使用这种方法,但这是一个遗留应用程序,我想看看是否可行。如果你能告诉我为什么不建议这样做,我一定会向上级解释。
更新:
我得到了填充值的配置,
ServiceSecurityContext.Current.PrimaryIdentity.Name
我在 web.config 文件中创建了以下绑定:
<wsHttpBinding>
<binding name="PaymentSecureServiceEndpoint" closeTimeout="00:01:00">
<security mode="Message">
</security>
</binding>
</wsHttpBinding>
但是,我希望该值是客户端应用程序的名称,它是我的用户名。同样,我阅读的文档表明该值将是访问 Web 服务的客户端应用程序的名称。我尝试设置的值
webSeviceName.ClientCredentials.UserName.UserName = "Test Client"
到应用程序名称的值,但这也不起作用。
如何获取正在访问 Web 服务的应用程序的名称?
谢谢。