
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.