2013-04-30 9 views
7

Próbuję użyć usługi stron trzecich, która jest zabezpieczona przez użytkownika/hasło. Sądzę, że zrobiłem to, co jest potrzebne do uwierzytelnienia i ustawienia użytkownika i przejścia, ale wydaje się, że nie uwzględniam ich w nagłówku http lub czymś ...WCF - BasicHttpBinding, Brak nazwy użytkownika i/lub hasła, nazwa: null, hasło: null

Podczas próby połączenia;

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

Otrzymuję ten błąd;

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

Pełny kod:

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> 

+1

Cóż, w celu wyeliminowania potencjalnego pewne zamieszanie, drugi definicja wiążąca ('ServiceSoapBinding1') nie jest aktualnie określany (w kodzie zostały przedstawione), więc zostanie zignorowany i można bezpiecznie usunąć. – paul

+1

Dzięki, przegapiłem to podczas wysyłania. Usunięto go z przykładu. – Tomcat

+1

Głupie pytanie, ale czy masz dokumentację, jak to zrobić? Co mówi trzecia strona? –

Odpowiedz

5

Po wielu kwestiach, stwierdziliśmy, że z jakiegoś powodu nagłówek Authorization nie był wysłany do służby. Aby to uwzględnić, musiałem wykonać poniższe połączenie, aby zadzwonić do usługi. Nadal nie rozumiem, dlaczego to jest problem. Z tego co myślałem, że BasicHttpBinding ma domyślnie zawierać poświadczenia w nagłówku? Wszelkie docenienie przez kogoś, dlaczego było to dla mnie problemem, spotkałoby się z dużym uznaniem. Dobra odpowiedź na to pytanie może nadal wynosić +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 
1

Jeżeli wymagane jest uwierzytelnianie podstawowe HTTP tylko, to trzeba określić podstawowe bezpieczeństwo BasicHttpBinding w następujący sposób :

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

Oczywiście można podać te wartości w kodzie.

Rzeczywiste poświadczenia muszą być zawsze podane w kodzie:

client.ClientCredentials.UserName.UserName = "userName"; 
client.ClientCredentials.UserName.Password = "password"; 
+2

Usługa korzysta z podstawowego, ale jeśli używam funkcji transportCredentialOnly, nie podoba mu się adres URL https. Ponadto, jeśli robię to, co robię w kodzie, czy to powiązanie app.config jest nawet używane do czegokolwiek? – Tomcat

Powiązane problemy