7

ユーザー/パスで保護されているサードパーティの Web サービスを使用しようとしています。ユーザーとパスを認証して設定するために必要なことを行ったと思いますが、それらをhttpヘッダーなどに含めていないようです...

電話をかけようとすると、

nameList.AddRange(service.getBlobNameByIdAndSectionId(section, id))

このエラーが発生します。

No user name and/or password is available, name: null, password: null

完全なコード:

Private Function GetVendorService() As Services.ServiceClient
    Dim binding As New BasicHttpBinding(BasicHttpSecurityMode.Transport)

    binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName
    binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic
    Dim ea As New EndpointAddress(GetVendorServiceURL())

    Dim service As New Services.ServiceClient(binding, ea)
    service.ClientCredentials.UserName.UserName = "user"
    service.ClientCredentials.UserName.Password = "password"

    Return service

End Function

Public Function GetVendorServiceURL() As String
    Select Case Informix.HostType
        Case HostServerType.Stage
            Return "https://url-s.net:8443/cxf/Service/v1/ws"
        Case HostServerType.Dev
            Return "https://url-d.net:8443/cxf/Service/v1/ws"
        Case Else 'Live
            Return "https://url.net:8443/cxf/Service/v1/ws"
    End Select
End Function

Private Function GetPdfListById(ByVal Id As Integer, ByVal Section As SectionId) As List(Of Services.blobName)
    Dim service As Services.ServiceClient = GetVendorService()
    Dim nameList As New List(Of Services.blobName)
    service.Open()
    nameList.AddRange(service.getBlobNameByIdAndSectionId(section, id))
    service.Close()
    Return nameList
End Function

app.config

<system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="ServiceSoapBinding" closeTimeout="00:01:00"
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
      maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
      messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
      useDefaultWebProxy="true">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <security mode="Transport">
        <transport clientCredentialType="None" proxyCredentialType="None"
          realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
<client>
  <endpoint address="https://url.net:8443/cxf/Service/v1/ws"
    binding="basicHttpBinding" bindingConfiguration="ServiceSoapBinding"
    contract="Services.Service"
    name="ServiceSoapPort" />
</client>

4

2 に答える 2

7

多くの問題の後、何らかの理由で Authorization ヘッダーがサービスに送信されていないことがわかりました。それを含めるには、サービスへの呼び出しのために以下を実行する必要がありました。私がまだ混乱しているのは、なぜこれが問題なのかということです。BasicHttpBinding は、デフォルトでヘッダーに資格情報を含めることになっていたと思いますか? なぜこれが私にとって問題だったのかについての誰かの洞察は大歓迎です. そして、それに対する良い答えはまだ+50を得るかもしれません.

Private Function GetPdfListById(ByVal Id As Integer, ByVal Section As SectionId) As List(Of VendorGuideService.vogBlobName)
    Using service As Service.ServiceClient = GetVendorService()
        Dim nameList As New List(Of Service.blobName)
        Using scope As ServiceModel.OperationContextScope = New ServiceModel.OperationContextScope(service.InnerChannel)
            Dim request As New ServiceModel.Channels.HttpRequestMessageProperty()
            request.Headers.Add("Authorization", "Basic " & Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(service.ClientCredentials.UserName.UserName & ":" & _
                                                                                                    service.ClientCredentials.UserName.Password)))
            ServiceModel.OperationContext.Current.OutgoingMessageProperties(ServiceModel.Channels.HttpRequestMessageProperty.Name) = request
            nameList.AddRange(service.getBlobNameByIdAndSectionId(section, id))
        End Using
        Return nameList
    End Using
End Function
于 2013-05-07T18:04:51.490 に答える
1

必要な認証が HTTP Basic のみの場合、basicHttpBinding のセキュリティを次のように指定する必要があります。

<basicHttpBinding>
    <binding ...>
        <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Basic" />
        </security>
    </binding>
</basicHttpBinding>

もちろん、これらを代わりにコードで指定することもできます。

実際の資格情報は常にコードで指定する必要があります。

client.ClientCredentials.UserName.UserName = "userName";
client.ClientCredentials.UserName.Password = "password";
于 2013-05-03T18:23:21.473 に答える