Search code examples
asp.netasmx

Basic Authentication with asmx web service


I'm trying to implement Basic Authorization for an ASMXweb service. I created the client as a service reference in VS2015. I'm using code in Asmx web service basic authentication as an example.

I'm entering login info in ClientCredentials as below

   Dim svc As New WebServiceSoapClient()
   svc.ClientCredentials.UserName.UserName = "userId"
   svc.ClientCredentials.UserName.Password = "i2awTieS0mdO"

My problem is that in the Authorization HttpModule in the web service, these credentials are not being passed to module. Is there an alternate way to do this?


Solution

  • I found the parts answer at How to add HTTP Header to SOAP Client. I had to combine a couple of answers on that page to get it to work.

        Dim svc As New WebServiceSoapClient()
        Dim responseService As SoapResponseObject
        Using (new OperationContextScope(svc.InnerChannel))
    
            Dim auth = "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes("userId:i2awTieS0mdO"))
    
            Dim requestMessage = New HttpRequestMessageProperty()
            requestMessage.Headers("Authorization") = auth
            OperationContext.Current.OutgoingMessageProperties(HttpRequestMessageProperty.Name) = requestMessage
    
            dim aMessageHeader = MessageHeader.CreateHeader("Authorization", "http://tempuri.org", auth)
            OperationContext.Current.OutgoingMessageHeaders.Add(aMessageHeader)
    
            responseService = svc.ListDistricts(requestService)
    
        End Using
    

    One key thing to be aware of is that the soap client call has to be inside the Using statement. In the above code, this is the next to last line.