簡體   English   中英

如何發現綁定配置以在Web服務中進行身份驗證

[英]How discover the binding configuration to authenticate in web service

我使客戶端使用Visual Studio 2010中的Web服務,並使用WSDL自動創建代理類。 在開發環境中,沒關系,可以正常工作,因為它不需要在此環境中進行身份驗證。

我的問題是服務在測試和生產(真正的工作)環境中具有身份驗證。 WSDL沒有描述它。 他們兩個都使用相同的開發環境的WSDL。

如果我嘗試在測試環境中使用瀏覽器查看WSDL,則將“?WSDL”放在端點地址之后,它不會像開發環境那樣返回WSDL。 它返回一個認證表單,一個普通的html,並在通知用戶和密碼后返回WSDL(與開發環境相同)。

我做了這樣的app.config綁定配置:

<wsHttpBinding>
          <binding name="WebServiceSoapAuth" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="true" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"  maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Mtom" textEncoding="utf-8"  useDefaultWebProxy="true">
            <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
            <security mode="None">
              <transport clientCredentialType="Basic" proxyCredentialType="None" realm=""/>
              <message clientCredentialType="UserName" algorithmSuite="Default"/>
            </security>
          </binding>  
        </wsHttpBinding>

如果我使用由VS 2010自動創建的basicHttpBinding(在開發環境中工作),則我的服務使用者將按預期返回“無法驗證或授權安全令牌”。

更改為wsHttpBinding(上面的代碼),它返回“內容類​​型為text / html;響應消息的charset = utf-8與綁定的內容類型不匹配(application / soap + xml; charset = utf-8)。如果使用自定義編碼器,請確保正確實現IsContentTypeSupported方法。響應的前1024個字節為:“”,后跟表單身份驗證html代碼。

我不知道我必須使用什么綁定配置。

我使用SoapUI測試了服務消耗,並且可以在兩種環境下工作,並且可以在身份驗證下工作,我只需要通知用戶和密碼,並且需要將“ WSS-Password Type”請求配置更改為“ PasswordText”(僅通知用戶和密碼我有“無法驗證或未授權安全令牌”返回)。

我對我的英語不好感到抱歉,我不太流利,如果我在問題類別或格式方面犯了一些錯誤。

編輯:我無法在具有身份驗證的環境中可視化wsdl文件。 當我在地址后面加上?WSDL時,它給了我一個進行身份驗證的表單(來自Ensemble InterSystems軟件的表單),而不是wsdl。

我使用SoapUI測試了服務消耗,並且可以在兩種環境下工作,並且可以在身份驗證下工作,我只需要通知用戶和密碼,並且需要將“ WSS-Password Type”請求配置更改為“ PasswordText”(僅通知用戶和密碼我有“無法驗證或未授權安全令牌”返回)。

為什么使用自動生成的類僅通知用戶並通過不起作用? 有人有主意嗎? 什么綁定配置等同於SoapUI配置的“ WSS-Password Type”等於“ PasswordText”? (我想這是為什么如果我只通知用戶名和密碼就無法使用的關鍵)

編輯2 :肥皂消息的正文正常。 我在制作標題時遇到麻煩。 可能是這樣的:

<soapenv:Header> <wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> <wsse:UsernameToken wsu:Id="UsernameToken-5"> <wsse:Username>USERNAME</wsse:Username> <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password> <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">E1XqZ2v8IDaTBzfF3j/TOA==</wsse:Nonce> <wsu:Created>2012-12-21T12:24:23.380Z</wsu:Created> </wsse:UsernameToken> </wsse:Security> </soapenv:Header>

正如我所說,我無權訪問服務器,它在我的客戶手中。 我只知道它是用Java制造的。

首先,您應該檢查客戶端是否使用與服務器相同的綁定。 例如,如果您的客戶端使用wsHttpBinding,但指向使用basicHttpBinding的服務,則在幾乎所有情況下都會出錯。

其次,將安全性模式設置為none,這意味着它將不使用傳輸或郵件安全性,我認為這不是您想要的。 如果要使用

<transport clientCredentialType="Basic" proxyCredentialType="None" realm=""/>

<message clientCredentialType="UserName" algorithmSuite="Default"/>

那么您應該將安全模式設置為TransportWithMessageCredential。 這將使用HTTPS的傳輸安全性和身份驗證的消息安全性。 其他安全模式將僅使用clientCredentialType之一(傳輸將使用傳輸clientCredentialType,而Message將使用消息clientCredentialType)。

希望這可以幫助 :)。

我必須手動創建一個http webrequest,並且必須手動創建xml並將其傳遞給請求。 postData變量來自手動創建的xml。

    Dim byteArray As Byte() = Encoding.UTF8.GetBytes(postData)
    Dim req As HttpWebRequest = DirectCast(WebRequest.Create("http://site.customer/ens/qa/customer.bs.ws.service.cls"), HttpWebRequest)
    req.Method() = "POST"
    req.UserAgent = "Apache-HttpClient/4.1.1 (java 1.5)"
    req.ContentType = "text/xml;charset=UTF-8"
    req.ContentLength = byteArray.Length
    req.KeepAlive = True
    req.Host = "site.customer"
    req.AutomaticDecompression = 3
    req.Headers.Add("SOAPAction", "http://www.tempuri.org/customer.bs.ws.service.function")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM