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] { 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 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()); |
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.