Implementando segurança em WebService utilizando .NET
by André Melo on Nov.22, 2009, under asp .net, segurança, soap, SoapHeader, SOAPHeaderService, web, webservice, WebServiceBinding
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.
Analista de Sistemas
- André Melo
- Osasco, São Paulo, Brazil
- Analista de Sistemas 27 anos, Brasileiro, Casado, 2 filhos.
Pesquisar no blog
Arquivo
-
▼
2010
(7)
-
▼
maio
(7)
- Adicionando efeito fade-in e fade-out no seu formu...
- Como Iniciar / Parar um Serviço do Windows instala...
- Criando um documento PDF passo-a-passo usando iTex...
- Adicionando conteúdo ao final de um arquivo usando...
- Como transformar em letras maiúsculas as iniciais ...
- Credenciais Proxy nas solicitações HTTPS
- Implementando segurança em WebService utilizando .NET
-
▼
maio
(7)
0 comentários