Desenvolvimento - Web Services
Usando SOAP Headers - Segurança em WebService
Esse artigo trata de descrever como criar WebService com segurança um passo a passo.
por Mauricio JuniorOlá, 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.
Estou 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.
- Verificando disponibilidade de um serviço WCF ou WebServiceC#
- Criando um WebService com ASP.NET Razor e WebMatrixWeb Services
- Construindo um List Suggest com ASP.NET Web Services e JQueryASP. NET
- Consumindo serviços REST com HttpClientWeb Services
- REST e o WSDLWeb Services