none
Problema ao autenticar webservice. RRS feed

  • Pergunta

  • Estou tentando consumir um webservice feito em coldfusion que precisa de autenticação. Tenho um exemplo feito em php que funciona belezinha que segue abaixo:

     

    <?php
    $sh_param = array(
    'login' => 'username',
    'password' => 'password');
     $soapClient = new SoapClient(".../webservive.cfc?wsdl",$sh_param);
    ?>

    O meu código c# é o seguinte:

     

    ws.ws_autentica auth = new ws.ws_autentica();
    CredentialCache myCredential = new CredentialCache();
    NetworkCredential credential = new NetworkCredential("username", "password");
    myCredential.Add(new Uri(auth.Url), "Basic", credential);
    auth.UseDefaultCredentials = false;
    auth.Credentials = myCredential;
    object xml = auth.validaUsuarioEmpresa("asdas", "adas", "adasd");

     

    Na minha implementação em c# eu não consigo autenticar alguém tem alguma dica?

     



    terça-feira, 19 de julho de 2011 17:03

Respostas

  • Obrigado Ruth!

    Consegui resolver o problema de outra forma

    Fazendo uma pesquisa vi que esse modelo de autenticação é chamada de Autenticação básica e é necessário inserir o aributo Authorizarion no header da chamada SOAP. Só que o .net não estava colocando a informação no header, para resolver o problema eu sobrescrevi o método GetWebRequest do meu webservice.

    Abaixo segue a alteração realizada:

    protected override WebRequest GetWebRequest(Uri uri)
            {
               
                HttpWebRequest req = (HttpWebRequest)base.GetWebRequest(uri);

                if (PreAuthenticate)
                {
                    NetworkCredential cred = Credentials.GetCredential(uri, "Basic");

                    if (cred != null)
                    {
                        Byte[] userpass = new UTF8Encoding().GetBytes(cred.UserName + ":" + cred.Password);

                        req.Headers["Authorization"] = "Basic " + Convert.ToBase64String(userpass);
                    }
                    return (WebRequest)req;
                }
                return null;
            }  

    Dessa forma uso a minha classe que herda do meu webservice e funciona perfeitamente.

    • Marcado como Resposta NatanSouza quinta-feira, 21 de julho de 2011 16:21
    quinta-feira, 21 de julho de 2011 16:21

Todas as Respostas

  • Oi Natan, para conectar em um web service vc pode usar essa thread:

    http://social.msdn.microsoft.com/Forums/pt/webservicespt/thread/40f28698-16af-42ed-ad72-fd8e991b5556

     

    Funciona direitinho!


    Espero ter ajudado
    Ruth
    MVP, MCTS - Biztalk Server
    www.biztalkbrasil.com.br
    • Sugerido como Resposta Ruth Resende quarta-feira, 20 de julho de 2011 12:07
    quarta-feira, 20 de julho de 2011 12:07
  • Qual SoapAction eu devo colocar?
    quarta-feira, 20 de julho de 2011 13:14
  • Normalmente o SoapAction esta descrito no wsdl do web service.

     

    Procura a tag soapAction, vc deve encontrar!


    Espero ter ajudado
    Ruth
    MVP, MCTS - Biztalk Server
    www.biztalkbrasil.com.br
    • Sugerido como Resposta Ruth Resende quarta-feira, 20 de julho de 2011 13:23
    quarta-feira, 20 de julho de 2011 13:22
  • Obrigado Ruth!

    Consegui resolver o problema de outra forma

    Fazendo uma pesquisa vi que esse modelo de autenticação é chamada de Autenticação básica e é necessário inserir o aributo Authorizarion no header da chamada SOAP. Só que o .net não estava colocando a informação no header, para resolver o problema eu sobrescrevi o método GetWebRequest do meu webservice.

    Abaixo segue a alteração realizada:

    protected override WebRequest GetWebRequest(Uri uri)
            {
               
                HttpWebRequest req = (HttpWebRequest)base.GetWebRequest(uri);

                if (PreAuthenticate)
                {
                    NetworkCredential cred = Credentials.GetCredential(uri, "Basic");

                    if (cred != null)
                    {
                        Byte[] userpass = new UTF8Encoding().GetBytes(cred.UserName + ":" + cred.Password);

                        req.Headers["Authorization"] = "Basic " + Convert.ToBase64String(userpass);
                    }
                    return (WebRequest)req;
                }
                return null;
            }  

    Dessa forma uso a minha classe que herda do meu webservice e funciona perfeitamente.

    • Marcado como Resposta NatanSouza quinta-feira, 21 de julho de 2011 16:21
    quinta-feira, 21 de julho de 2011 16:21