Demo Blog

Implementando segurança em WebService utilizando .NET

by André Melo on Nov.22, 2009, under , , , , , , ,



Quantas vezes já tentamos implementar segurança
nas chamadas aos nossos WebServices? Pois bem, veremos aqui uma forma simples de realizar esta rotina de segurança.


Introdução

Existem tantas maneiras de fazer isso, uma delas é a utilização de cabeçalho SOAP personalizado. Usando esse método, basta adicionar um cabeçalho SOAP em nossos WebServices.
Vamos inserir o cabeçalho SOAP e validar o seu conteúdo no servidor.
Quando a validação do cabeçalho SOAP é realizada, o WebService envia a resposta para o servico que à consumiu.
Até aqui tranquilo?


Vamos ao Código

Agora vamos ver como fazer isso no Visual Studio:

///
/// Resumo da descrição para SOAPHeaderService
///
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(Name = "TestService",ConformsTo = WsiProfiles.BasicProfile1_1)]
public class SOAPHeaderService : System.Web.Services.WebService
{
public SOAPHeaderService()
{
//Uncomment the following line if using designed components
//InitializeComponent();
}

Observe que o atributo "WebServiceBinding" tem o argumento "Name" definido como "TestService", isso eu explicarei mais adiante.
Agora, definimos o cabeçalho SOAP personalizado que será incluiso na mensagem SOAP.
Para isso, vamos criar uma classe herdada de "System.Web.Services.Protocols.SoapHeader", e suas propriedades.

public class UserCredentials : System.Web.Services.Protocols.SoapHeader
{
public string userName;
public string password;
}

Vamos adicionar uma instância do cabeçalho em nosso serviço:

public class SOAPHeaderService : System.Web.Services.WebService
{
// Visual studio will append a "UserCredentialsValue" property to
// the proxy class
public UserCredentials consumer;

Agora, nós temos que escrever um "Web Method" que utilizará esse cabeçalho.

[WebMethod]
[SoapDocumentMethod(Binding = "TestService")]
[SoapHeader("consumer",Required=true)]
public string GetBalance()
{
if (checkConsumer())
return consumer.userName + " had 10000000 credit";
else
return "Error in authentication";
}

private bool checkConsumer()
{
// In this method you can check the username and password
// with your database or something
// You could also encrypt the password for more security
if (consumer != null)
{
if (consumer.userName == "Alves" && consumer.password == "1234")
return true;
else
return false;
}
else
return false;
}

Note que eu adicionamos um valor "Binding", o mesmo que eu usamos para declarar o serviço. Também declaramos o cabeçalho SOAP que será exigido no método quando chamado.
Agora, a única coisa que resta é consumir o serviço com o cabeçalho SOAP:

SOAPHeaderService service = new SOAPHeaderService();
UserCredentials user = new UserCredentials();

user.userName = "Alves";
user.password = "1234";

service.UserCredentialsValue = user;

Console.WriteLine(service.GetBalance());

Adicionamos a referência do serviço e do cabeçalho SOAP, definimos as propriedades do cabeçalho SOAP, anexamos o cabeçalho com a mensagem SOAP e em seguida já podemos realizar a chamada do "WebService".
Este é o resultado depois de executar o serviço com o username = "Alves" e senha = "1234"



E este com outros dados:





Conclusão

Proteger os serviços web é uma coisa que muitos desenvolvedores ignoram, até porque parece ser uma tarefa difícil e desagradável. Mas com um pouco de paciência poderá ver que é bem mais simples do imaginamos.
Até a próxima.
0 comentários more...

0 comentários

Postar um comentário

Procurando algo?

use o mecanismo de busca para pesquisar no meu blog:

Não encontrou o que procura? Deixe um comentário no post para que possa solucionar a questão!