如何发现绑定配置以在Web服务中进行身份验证

时间:2012-12-14 17:01:04

标签: c# vb.net web-services wsdl

我让客户端在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制作的。

2 个答案:

答案 0 :(得分:1)

首先,您应该检查客户端是否使用与服务器相同的绑定。例如,如果您的客户端使用wsHttpBinding但指向使用basicHttpBinding的服务,则几乎在所有情况下都会出错。

其次,您将安全模式设置为none,这意味着它不会使用传输或消息安全性,我不认为这是您想要的。 如果你想使用

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

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

然后您应该将安全模式设置为TransportWithMessageCredential。这将使用HTTPS和Message安全性的传输安全性进行身份验证。其他安全模式只使用clientCredentialType之一(传输将使用传输clientCredentialType,Message将使用Message clientCredentialType)。

希望这会有所帮助:)。

答案 1 :(得分:0)

我必须手动创建一个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")