WebService utilizando soapHeader e token
Saiba utilizar de forma prática e simples webservice com tok
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.
Subscribe ecode10.com
Receive our latest updates about programming languages, software, database, books, ebooks, classes, jobs and more.
You can cancel anytime.
Log In