Conecte-se com o WCF para uma autenticação de Serviço Web com nome de usuário / senha

StackOverflow https://stackoverflow.com/questions/806007

Pergunta

Eu criei um proxy de um serviço Web com o Visual Studio 2008, e criou para mim a seguinte entrada no app.config:

<system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="MyNameHandlerSoapBinding" 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="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
          <endpoint address="http://www.***/***/***"
              binding="basicHttpBinding" bindingConfiguration="MyNameHandlerSoapBinding"
              contract="***.MyNameHandler" name="MyName">
          </endpoint>
        </client>
    </system.serviceModel>

O webservice é tem autenticação de nome de usuário / senha, então eu preciso adicioná-lo em algum lugar aqui.

Estou um pouco perdido no mar de documentação WCF, eu acho que tem que mudar de basicHttpBinding para wsHttpBinding ou customBinding para ser capaz de adicionar os elementos de autenticação, mas eu realmente não entendo isso. Alguém poderia dar qualquer dica rápida ou qualquer link útil que diz como fazê-lo?

EDIT:

Eu mudei a seção de segurança para:

<security mode="Transport">
    <transport clientCredentialType="Basic" proxyCredentialType="None"
         realm="" />
</security>

e acrescentou no código:

ws.ClientCredentials.UserName.UserName = "";
ws.ClientCredentials.UserName.Password = "";

Agora parece que ele pode estar usando as credenciais, mas ele está me dando o erro:

o esquema URI fornecida 'http' é inválido URI esperado 'https'

Eu não sei mesmo se este é o caminho certo a seguir ...

Foi útil?

Solução

eu postar aqui a solução para os futuros leitores:

<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="MyHandlerSoapBinding" 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="TransportCredentialOnly">
            <transport clientCredentialType="Basic"  />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://www.***/***/***/MyHandler"
          binding="basicHttpBinding" bindingConfiguration="MyHandlerSoapBinding"
          contract="***.MyHandler" name="MyHandler">
      </endpoint>

    </client>
  </system.serviceModel>

No final, eu poderia usar o basicHttpBinding padrão. A única diferença do código postado na questão é o segurança nó .

Além disso, observe o mode = "TransportCredentialOnly" opção, esta permite-lhe enviar nome de usuário / senha utilizando http vez de https. Isso é necessário para testar ambientes como o que eu estou usando. Mais tarde, obviamente, você vai preferir https para enviar suas credenciais.

Depois de código que você digite seu nome de usuário / senha:

var ws = new ***.MyHandlerClient("MyHandler");
ws.ClientCredentials.UserName.UserName = "myUsername";
ws.ClientCredentials.UserName.Password = "myPassword";
var result = ws.executeMyMethod();

Outras dicas

A mensagem de erro é certo. WCF não permitirá o transporte de nomes de usuários e senhas sobre um protocolo desprotegido. Seu serviço web deve estar usando HTTPS (com o certificado SSL atendente)

Depois de ter um certificado SSL você tem duas opções sobre como as credenciais são enviadas, transporte ou segurança e múltiplas opções para o tipo de credencial. MSDN tem um bom guia para todas as várias opções.

Eu tive o mesmo problema e tentou a solução acima De alguma forma, isso não funciona para mim Eu estava continuo recebendo a mensagem "No WS-Security cabeçalho encontrado"

Depois de um longo tempo de testar e experimentar eu conseguir obtê-lo trabalho Eu adicionei o código de cabeçalho no cliente como abaixo e, em seguida, ele funciona!

<client>
    <endpoint address="http://your.service.com" binding="basicHttpBinding" bindingConfiguration="XXXBinding" contract="contract.XXX" name="XXXPort">
        <headers xmlns:wsse="http://your.xsd">
            <wsse:Security mustUnderstand="1">
                <wsse:UsernameToken>
                    <tenant>XXX</tenant>
                    <wsse:Username>XXX</wsse:Username>
                    <wsse:Password Type="http://www.xxxx.com/wss#PasswordText">XXX</wsse:Password>
                </wsse:UsernameToken>
            </wsse:Security>
        </headers>
    </endpoint>
</client>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top