views:

551

answers:

2

I have a generic proof of concept WCF service that is using forms authentication to secure access. All works great when my client is .NET (vb code below)

Dim client As SupplierServiceClient = New SupplierServiceClient()
client.ClientCredentials.UserName.UserName = "[email protected]"
client.ClientCredentials.UserName.Password = "password"

Dim SupplierList As List(Of Supplier) = client.GetSuppliers()

but as I want this to interop w/ anyone who can do SOAP 1.1/1.2 - how would a PHP or Java client connect?

My WCF web.config is listed below (fyi)

<system.serviceModel>
 <services>
  <service name="SampleApplicationWCF.Library.SupplierService" behaviorConfiguration="NorthwindBehavior">
   <endpoint address="" name="wsHttpSupplierService" contract="SampleApplicationWCF.Library.ISupplierService" binding="wsHttpBinding" bindingConfiguration="wsHttp"/>
   <endpoint address="https://server/SampleApplicationWCF/SupplierService.svc/Basic" name="basicHttpSupplierService" contract="SampleApplicationWCF.Library.ISupplierService" binding="basicHttpBinding" bindingConfiguration="basicHttp"/>
   <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex"/>
  </service>
 </services>
 <bindings>
  <wsHttpBinding>
   <binding name="wsHttp">
    <security mode="TransportWithMessageCredential">
     <transport/>
     <message clientCredentialType="UserName" negotiateServiceCredential="false" establishSecurityContext="true"/>
    </security>
   </binding>
  </wsHttpBinding>
  <basicHttpBinding>
   <binding name="basicHttp">
    <security mode="TransportWithMessageCredential">
     <transport/>
     <message clientCredentialType="UserName"/>
    </security>
   </binding>
  </basicHttpBinding>
 </bindings>
 <behaviors>
  <serviceBehaviors>
   <behavior name="NorthwindBehavior">
    <serviceMetadata httpGetEnabled="true"/>
    <serviceAuthorization principalPermissionMode="UseAspNetRoles"/>
    <serviceCredentials>
     <userNameAuthentication userNamePasswordValidationMode="MembershipProvider"/>
    </serviceCredentials>
   </behavior>
  </serviceBehaviors>
 </behaviors>
</system.serviceModel>
+1  A: 

Disclaimer: I am NOT a Java or PHP developer

By setting the UserName values on the client oject, you're telling WCF to ship that information across the wire as part of the SOAP header. Since SOAP is a very widely adopted standard, I'm sure there are libraries out there that will help you add that information to the SOAP message header. I would look for something that helps you consume services using WS-* and/or WS-I Basic Profile specfications.

Good luck.

James Bender
+2  A: 

Hi Toran

Did you figure it out? I'm having the same issue as you've mentioned. I can't find any relevant information on the internet. Do you mind to share your solution?

Vincent