WCF头痛 - 使用用户名和密码通过HTTP进行身份验证

时间:2014-07-03 13:32:00

标签: web-services wcf passwords username peoplesoft

所有

我正在尝试进行.net WCF调用,我认为这应该很简单,但事实证明非常困难。我真的可以使用一些帮助,并在完全披露我是一个WCF新手。这是场景:

  1. 我正在尝试使用C#调用PeopleSoft CI Web服务,该服务使用PeopleSoft端的用户名和密码进行保护。
  2. 核心问题是安全标头(例如用户名和密码)未正确发送到PeopleSoft Web服务。
  3. 我做了很多研究,并在过去几天做了很多尝试并取得了一些进展,但最重要的是我不能让它发挥作用。
  4. 下面列出的项目是我原来的起始块,我不会用我尝试的所有选项来覆盖线程。
  5. 原始WSDL指向标准HTTP站点。我已尝试使用HTTPS,并认为这可以解决问题。没有运气
  6. Web服务架构如下:

     <HEADER>
        <USERID>myID</USERID>
        <PASSWORD>????</PASSWORD>
        <LANGUAGE_CD>ENG</LANGUAGE_CD>
      </HEADER>
      <that>Ithid</that>
      <Strcurrent_action>target</Strcurrent_action>
      <Strnew_action>action</Strnew_action>
      <StractionConfirm>action</StrpasswordConfirm>
    </MyAction__This__Stuff_SELF>
    
    • 我从svcutil生成了C#类和配置文件。 app.config显示如下:

      <system.serviceModel>
          <bindings>
              <basicHttpBinding>
                  <binding name="MyStuff_Binding" />
              </basicHttpBinding>
          </bindings>
      
    • 我使用以下代码拨打电话:

      MyStuff_PortTypeClient client = new MyStuff_PortTypeClient(“MyStuff_Port”);    client.ClientCredentials.UserName.UserName =“MyLogon”;    client.ClientCredentials.UserName.Password =“MyPassword”;
         MyAction__CompIntfc__USER_PROFILETypeShape actionShape = new MyAction__CompIntfc__USER_PROFILETypeShape();     UserIDTypeShape targetUser = new UserIDTypeShape();     尝试     {client.MyStuff_MyAction(actionShape); //拨打电话}

    • 正如我所提到的,我尝试了很多方法,包括更改basicHttpBinding中的安全性,消息和传输选项,尝试使用wsHttpBinding,自定义标题等......并且没有快乐。

    • 我非常感谢有关如何通过http或https调用用户名和密码保护的PeopleSoft Web服务的任何帮助和成功示例。

  7. 由于

1 个答案:

答案 0 :(得分:0)

我也遇到了很多麻烦,但是让它发挥作用......有点儿。我不得不手动将标题放在配置文件中,如此...

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="PeopleSoft_Binding">
          <security mode="Transport" />
        </binding>
      </basicHttpBinding>
    </bindings>

    <client>
      <endpoint name="MyEndpoint"
                bindingConfiguration="PeopleSoft_Binding"                    
                contract="ProxyClass.ProxyClass_PortType"
                binding="basicHttpBinding"
                address="https://MyPeoplesoftInstance/PeopleSoftServiceListeningConnector">
        <headers>
          <wsse:Security soap:mustUnderstand="1" 
                         xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
                         xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
            <wsse:UsernameToken>
              <wsse:Username>TheUser</wsse:Username>
              <wsse:Password>ThePassword</wsse:Password>
            </wsse:UsernameToken>
          </wsse:Security>
        </headers>
      </endpoint>
    </client>
  </system.serviceModel>
</configuration>

然后,按正常方式调用它......

using (var client = new MyProxy.MyProxy_PortTypeClient("MyEndpoint"))
        {
            client.MyMethod();
        }

虽然这很有效,但由于凭据存储在配置文件中,因此不太理想。理想情况下,我希望能够以编程方式传递凭据,并且我已尝试了一系列涉及XmlSerializer,WCF配置等的内容,但到目前为止还没有任何工作。希望这个答案会让某人接下来一步。