简体   繁体   中英

Wcf basic auth not accepting username

I am trying to consume a SOAP service and am having authentication problems and think I may be missing something useful. I think the issue may be in that I'm passing in the header more than just the credentials (which I believe is what I have to do, but think it just makes the situation more unique). Below is my config file and the code I'm using to authenticate.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="MemberSoap">
          <security mode="Transport" />
        </binding>
        <binding name="MemberSoap1" />
        <binding name="TransactionSoap">
          <security mode="Transport" />
        </binding>
        <binding name="TransactionSoap1" />
        <binding name="CertificateSoap" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" maxBufferPoolSize="2147483647">
          <readerQuotas maxDepth="32" maxArrayLength="2147483647" maxStringContentLength="2147483647"/>
          <security mode="Transport" />
        </binding>
        <binding name="CertificateSoap1" />
        <binding name="MembershipSoap">
          <security mode="Transport">
            <transport clientCredentialType="Basic" proxyCredentialType="None" realm="" />
            <message clientCredentialType="Certificate" algorithmSuite="Default" />
          </security>
        </binding>
        <binding name="ContentSoap">
          <security mode="Transport" />
        </binding>
        <binding name="ContentSoap1" />
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="https://membership/member.asmx"
        binding="basicHttpBinding" bindingConfiguration="MemberSoap"
        contract="Member.MembershipWsMemberSoap" name="Ovs.Membership.Ws.MemberSoap" />
      <endpoint address="https://membership/transaction.asmx"
        binding="basicHttpBinding" bindingConfiguration="TransactionSoap"
        contract="MembershipWsTransactionSoap" name="TransactionSoap" />
      <endpoint address="https://membership/certificate.asmx"
        binding="basicHttpBinding" bindingConfiguration="CertificateSoap"
        contract="MembershipWsCertificateSoap" name="CertificateSoap" />
      <endpoint address="https://ngmembership/Membership.svc"
        binding="basicHttpBinding" bindingConfiguration="MembershipSoap"
        contract="Membership.IMembership" name="MembershipSoap" />
      <endpoint address="https://membership/content.asmx"
        binding="basicHttpBinding" bindingConfiguration="ContentSoap"
        contract="Content.MembershipWsContentSoap" name="ContentSoap" />
    </client>
  </system.serviceModel>
    <appSettings>
      <add key="UsernameAuth" value="user" />
      <add key="PasswordAuth" value="pass" />
    </appSettings>
</configuration>

I left out the base url for security purposes as well as the full namespaces, but the one I'm mainly concerned about is the name="MembershipSoap" service. Here is my first attempt at the code I'm using to authenticate.

public Transaction[] GetAllBookingInfo(string memberId, string partnerId)
{
    AllBookingsByMemberIdRS response;
    using (var client = new MembershipClient())
    using (new OperationContextScope(client.InnerChannel))
    {
        // add the basic auth header
        OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name]
            = GetBasicAuthHeader("user", "pass");
        var request = new AllBookingsByMemberIdRQ
        {
            MemberId = memberId,
            PartnerId = partnerId
        };
        response = AuthenticateServiceUser.membershipSession.GetAllBookingsByMemberId(request);
    }
    var trans = response.Transactions;
    return trans;
}

protected HttpRequestMessageProperty GetBasicAuthHeader(string userName, string password)
{
    // get the basic auth header
    HttpRequestMessageProperty httpRequestProperty = new HttpRequestMessageProperty();
    httpRequestProperty.Headers[HttpRequestHeader.Authorization] = "Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes(userName + ":" + password));
    return httpRequestProperty;
}

At this I get an error saying that there were 'Invalid web service credentials used'. So after reading I switched the first method to this.

public Transaction[] GetAllBookingInfo(string memberId, string partnerId)
{
    AllBookingsByMemberIdRS response;

    var client = new MembershipClient();
    client.ClientCredentials.UserName.UserName = "user";
    client.ClientCredentials.UserName.Password = "pass";

    using (new OperationContextScope(client.InnerChannel))
    {
        var request = new AllBookingsByMemberIdRQ
        {
            MemberId = memberId,
            PartnerId = partnerId
        };
        response = AuthenticateServiceUser.membershipSession.GetAllBookingsByMemberId(request);
    }
    var trans = response.Transactions;
    return trans;
}

And now I'm getting a 'The username is not provided. Specify username in ClientCredentials' error. So now I feel like I'm moving further away to where I was before. Maybe someone can shed some light on this? Thanks in advance!

I figured it out. I stupidly reference another client in my code - one without credentials. It's always those simple mistakes that get overlooked.

public Transaction[] GetAllBookingInfo(string memberId, string partnerId)
{
    AllBookingsByMemberIdRS response;
    using (var client = new MembershipClient())
    using (new OperationContextScope(client.InnerChannel))
    {
        // add the basic auth header
        OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name]
            = GetBasicAuthHeader("user", "pass");
        var request = new AllBookingsByMemberIdRQ
        {
            MemberId = memberId,
            PartnerId = partnerId
        };
        response = client.GetAllBookingsByMemberId(request);
    }
    return response.Transactions;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM