0

我有一个带有 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 服务的应用程序的名称?

谢谢。

4

0 回答 0