Olá, gostaria de explicar como criar WebService com segurança um passo a passo. Muitos usuários usam essa nova tecnologia de forma errada e sem qualquer fundamento. No decorrer do artigo, você irá entender o que estou falando.

 

Requerido:

Visual Studio.NET 2008

FrameWork: 3.5

Linguagem: C#.NET

Tecnologia: WebService

 

         Geralmente um desenvolvedor de software, arquiteto ou analista de sistema coloca a segurança do WebService mais no servidor e no banco de dados; nĂŁo está errado e atĂ© aconselho fazer isso. VocĂŞ deve estar me perguntando, mas como eu coloco uma segurança no sistema?

         Existem alguns profissionais de WebService que nĂŁo sabe como fazer a segurança de forma correta e coloca o usuário e senha como parâmetro de entrada no mĂ©todo.

         Trabalhei em uma empresa que tinha tudo, o servidor tinha segurança SSL para acessar, tinha segurança na senha criptografada no banco de dados mas, passava o usuário e senha como parâmetro de entrada no mĂ©todo; por exemplo: AbrirChamado(string usuário, string senha, string parâmetros).

         Dessa forma, nĂŁo adianta ser seguro no servidor, seguro no banco de dados se a senha e usuário estĂŁo sendo passados na chamada do mĂ©todo. Principalmente se esses dados foram passados sem qualquer criptografia.

         To certo que, esse tipo de tecnologia Ă© nova no mercado brasileiro, sĂł que nĂŁo existe justificativa para falta de segurança e aprender mais sobre o assunto. Um livro que escrevi em 2002, ensinei a criar e trabalhar com WebService, em 2002.

         Segue abaixo os prĂłximos passos na criação de um WebService seguro. Lembrando que Ă© um exemplo bem simples, mas que serve como base para customização. O primeiro Ă© um HelloWold mesmo. (Code 1.1)

 

 

 

using System;

using System.Web;

using System.Web.Services;

using System.Web.Services.Protocols;


[WebService(Namespace = "http://tempuri.org/")]

[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]


public class Service : System.Web.Services.WebService

{

    public ValidationSoapHeader Authentication;

    private const string DEV_TOKEN = "12345";

    public Service()

    {

        //Uncomment the following line if using designed components

        //InitializeComponent();

    }


    [SoapHeader("Authentication")]

    [WebMethod]

    public string HelloWorld()

    {

        if (Authentication != null && Authentication.DevToken == DEV_TOKEN)

        {

            return "Hello World";

        }

        else

        {

            throw new Exception("Authentication Failed");

        }

    }

}

 

Code 1.1

 

Explicação:

         A primeira coisa foi colocar o public ValidationSoapHeader Authentication e uma constante chamada DEV_TOKEN (private const string DEV_TOKEN = "12345";) que, serve como um “token” para ser autenticado e enviado no cabeçalho do WebService. Isso tambĂ©m evita do usuário comum ver o dado na assinatura do mĂ©todo.

         Logo depois, criei em cima do mĂ©todo HelloWorld uma tag chamada [SoapHeader(“Authentication”)] antes da tag de [WebMethod].

         Dentro do mĂ©todo verifiquei se o Authentication Ă© igual a null e o Authentication.DevToken Ă© igual a constante criada do token anterior, ou seja, DEV_TOKEN. Se houver essa validação, ele continua o mĂ©todo sem qualquer problema.

         O passo seguinte foi criar uma outra classe para colocar o cabeçalho de validação do soap header. (Code 1.2)

 

 

using System;

using System.Data;

using System.Configuration;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using System.Web.Services.Protocols;

/// <summary>

/// Summary description for ePhoneCredentials

/// </summary>

public class ValidationSoapHeader : SoapHeader

{

    private string _devToken;

    public ValidationSoapHeader()

    {
    }

    public ValidationSoapHeader(string devToken)

    {

        this._devToken = devToken;

    }

    public string DevToken

    {

        get { return this._devToken; }

        set { this._devToken = value; }

    }

}

 

Code 1.2

 

Explicação:

         Como falado anteriormente, criei uma outra classe chamada ValidationSoapHeader que extende de SoapHeader. Coloquei seus atributos colocando get e set.  

         Note que, existe um construtor da classe que recebe como parâmetro o token atribuĂ­do manualmente.  O prĂłximo passo Ă©: mostrar como consumir o WebService pelo cliente, passando os dados corretos dentro do SoapHeader.

         Lembro tambĂ©m que, pode ser colocado qualquer outro tipo de atributo no SoapHeader e verificado dentro do cĂłdigo. Pode ser gerado uma chave mais precisa e criptografada para a verificação tambĂ©m. Esse exemplo dado atĂ© o momento serve apenas como base.

 

 

localhost.ValidationSoapHeader header = new ConsoleMyCsharpClient.localhost.ValidationSoapHeader();

header.DevToken = "12345";

localhost.Service ws = new ConsoleMyCsharpClient.localhost.Service();

ws.ValidationSoapHeaderValue = header;

Console.WriteLine(ws.HelloWorld());
Console.ReadLine(); 

 

Code 1.3

 

Explicação:

         Criei uma instância do validador, coloquei o nĂşmero do toeken e chamei o serviço passando o SoapHeader antes de chamar o mĂ©todo. Caso o mĂ©todo houvesse qualquer parâmetro de entrada, basta colocá-lo na chamada normalmente.

 

Bom, fico por aqui e espero ter ajudado.

Qualquer dĂşvida, favor entrar em contato.