2013-04-30 46 views
7

Tôi đang cố gắng sử dụng dịch vụ web của bên thứ ba được bảo mật với người dùng/thẻ. Tôi tin rằng tôi đã thực hiện những gì cần thiết để xác thực và đặt người dùng và vượt qua, nhưng có vẻ như không bao gồm họ trong tiêu đề http hoặc ...WCF - BasicHttpBinding, Không có tên người dùng và/hoặc mật khẩu có sẵn, tên: null, mật khẩu: null

Khi cố gắng gọi;

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

Tôi gặp lỗi này;

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

Toàn mã:

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

Vâng, để loại bỏ một số nhầm lẫn tiềm ẩn, định nghĩa liên kết thứ hai của bạn ('ServiceSoapBinding1') hiện không được tham chiếu (trong mã bạn đã hiển thị), vì vậy sẽ bị bỏ qua và bạn có thể xóa nó một cách an toàn. – paul

+1

Cảm ơn, đã bỏ lỡ khi đăng bài. Đã xóa nó khỏi ví dụ. – Tomcat

+1

Câu hỏi ngu ngốc, nhưng bạn có tài liệu nào về cách thực hiện việc này không? Bên thứ ba nói gì? –

Trả lời

5

Sau rất nhiều vấn đề, tôi thấy rằng đối với một số lý do tiêu đề ủy quyền không được gửi đến dịch vụ. Để bao gồm nó, tôi đã phải làm như dưới đây cho các cuộc gọi đến dịch vụ. Những gì tôi vẫn còn nhầm lẫn là lý do tại sao đây là một vấn đề. Từ những gì tôi nghĩ BasicHttpBinding có nghĩa vụ phải bao gồm các thông tin trong tiêu đề theo mặc định? Bất kỳ cái nhìn sâu sắc của một ai đó là tại sao đây là một vấn đề đối với tôi sẽ được đánh giá cao. Và một câu trả lời tốt cho rằng vẫn có thể nhận được +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

Nếu xác thực yêu cầu là HTTP chỉ cơ bản, sau đó bạn cần phải xác định an ninh của basicHttpBinding như sau :

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

Tất nhiên, bạn có thể chọn chỉ định các mã này trong mã thay thế.

Các thông tin thực tế luôn luôn phải được cung cấp bằng mã:

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

Dịch vụ đang sử dụng Cơ bản, nhưng nếu tôi sử dụng transportCredentialOnly, dịch vụ này không thích url https. Ngoài ra, nếu tôi làm những gì tôi đang làm trong các mã hiện rằng app.config ràng buộc thậm chí được sử dụng cho bất cứ điều gì? – Tomcat

Các vấn đề liên quan