2016-09-28 4 views
0

Я пытаюсь использовать SOAP-сервис, и у меня проблемы с проверкой подлинности, и я думаю, что у меня может быть что-то полезное. Я думаю, проблема может заключаться в том, что я передаю в заголовке больше, чем только учетные данные (которые, я считаю, это то, что я должен сделать, но думаю, что это просто делает ситуацию более уникальной). Ниже приведен мой файл конфигурации и код, который я использую для аутентификации.Wcf basic auth не принимает имя пользователя

<?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> 

я ушел из базового URL в целях безопасности, а также полные пространства имен, но один я в основном беспокоит имя = сервис «MembershipSoap». Вот моя первая попытка кода, который я использую для аутентификации.

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; 
} 

При этом я получаю сообщение об ошибке «Использованы недопустимые учетные данные веб-службы». Поэтому после прочтения я переключил первый метод на это.

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; 
} 

И теперь я получаю «Имя пользователя не предусмотрено. Укажите имя пользователя в ошибке ClientCredentials. Так что теперь я чувствую, что уезжаю дальше, где я был раньше. Может быть, кто-то может пролить свет на это? Заранее спасибо!

ответ

0

Я понял. Я глупо ссылаюсь на другой клиент в своем коде - один без учетных данных. Это всегда те простые ошибки, которые забываются.

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; 
}