ASP .NET Web API -  Implementando a Segurança via Tokens - III


  Neste artigo vou mostrar como podemos implementar a segurança na Web API ASP .NET  usando Tokens.

Continuando o artigo anterior vamos agora implementar a segurança em uma Web API usando Tokens.

Para isso teremos que realizar as seguintes tarefas:

Transformando a Web API em uma aplicação OWIN

O objetivo da especificação OWIN é que a nossa aplicação não fique vinculado a um Sistema Operacional nem a um servidor, além disso aplicações OWIN tem um melhor desempenho. Com isso em mente podemos transformar nossa Web API em uma aplicação OWIN aplicando alguns pacotes.

Vamos Após criar sua aplicação Web API usando o template Empty acesse o Menu Tools > Nugetr Package Manager > Package Manager Console para abrir o console do Nuget e a seguir instale os pacotes abaixo:

Ativando o CORS na Web API via OWIN

Como temos o nosso backend, representando pela Web API, esta separada do cliente ou Front-end, com certeza vamos precisar receber requisições de domínios distintos, e, para isso teremos que habilitar o CORS em nossa aplicação Web API, pois sem fazer isso, qualquer requisição feita por um domínio diferente vai gerar a mensagem de erro : ‘access-control-allow-origen’.

A especificação CORS (Cross-Origin Resource Sharing ou Compartilhamento de recursos de origem cruzada é uma especificação sobre como trocar recursos entre o cliente e o backend quando o cliente, geralmente um navegador, tenta acessar um domínio distinto.

É um conjunto de regras, uma especificação da W3C, para que tipo de recursos podem ser acessados, e como os limitar. Estas regras são implementadas pelos navegadores, e é este (o browser) que limita o acesso.

Estas regras impuseram-se por razões de segurança. Para evitar que scripts na página possam acessar livremente e fazer pedidos a outros sites e interagir com eles.

Ativando o CORS estamos permitindo o acesso de outro site mesmo estando em domínios diferentes.

Para ativar o CORS em nossa Web API temos que instalar o pacote abaixo no projeto

Implementando o código na classe Startup

Agora que temos os pacotes instalados no projeto vamos criar uma classe Startup onde vamos configurar os recursos descritos acima.

No menu Project clique em Add New Item e selecione o template OWIN Startup Class informando o nome Startup.cs e clique no botão Add;

Vamos iniciar definindo algumas configuracões básicas:

using Microsoft.Owin;
using Microsoft.Owin.Cors;
using Microsoft.Owin.Security.OAuth;
using Owin;
using System;
using System.Web.Http;
[assembly: OwinStartup(typeof(FuncionariosAPIService.Startup))]
namespace FuncionariosAPIService
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // configuracao WebApi
            var config = new HttpConfiguration(); 
           // configurando rotas
           config.MapHttpAttributeRoutes();
           config.Routes.MapHttpRoute(
                 name: "DefaultApi",
                 routeTemplate: "api/{controller}/{id}",
                 defaults: new { id = RouteParameter.Optional }
            );
            // ativando cors
            app.UseCors(CorsOptions.AllowAll);
           // ativando configuração WebApi
            app.UseWebApi(config);
        }     
    }
}

Com essas configurações temos agora a nossa Web API como uma aplicação OWIN com o CORS ativado.

Precisamos avançar e agora definir a implementação do token que vai permitir acessar nossa Web API.

Para poder fazer isso vamos ter que instalar o pacote abaixo em nosso projeto:

Agora podemos implementar o método AtivarGeracaoTokenAcesso() para ativar o acesso via Token e após fazer a autenticação do usuário vamos gerar o token para este usuário.

[assembly: OwinStartup(typeof(FuncionariosAPIService.Startup))]
namespace FuncionariosAPIService
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // configuracao WebApi
            var config = new HttpConfiguration(); 
           // configurando rotas
           config.MapHttpAttributeRoutes();
           config.Routes.MapHttpRoute(
                 name: "DefaultApi",
                 routeTemplate: "api/{controller}/{id}",
                 defaults: new { id = RouteParameter.Optional }
            );
            // ativando cors
            app.UseCors(CorsOptions.AllowAll);
            // ativando a geração do token
            AtivarGeracaoTokenAcesso(app)
           // ativando configuração WebApi
            app.UseWebApi(config);
        }     
    }
}

A seguir temos o código do método AtivarGeracaoTokenAcesso(app) :

        private void AtivarGeracaoTokenAcesso(IAppBuilder app)
        {
            var opcoesConfiguracaoToken = new OAuthAuthorizationServerOptions()
            {
                AllowInsecureHttp = true,
                TokenEndpointPath = new PathString("/token"),
                AccessTokenExpireTimeSpan = TimeSpan.FromHours(1),
                Provider = new ProviderDeTokensDeAcesso()
            };
            app.UseOAuthAuthorizationServer(opcoesConfiguracaoToken);
            app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
        }

Vamos entender o código acima:

a)- criamos uma variável do tipo OAuthAuthorizationServerOptions que fornece informações necessárias para controlar o comportamento do middleware do Authorization Server.

b)- A seguir definimos as propriedades:

Para concluir vamos ativar o uso de tokens no projeto :

c-) Adiciona os recursos da autorização do servidor OAuth2 à nossa aplicação OWIN. Este middleware realiza o processamento da solicitação para os nós de extremidade de autorização e token definidos pela especificação OAuth2.

     app.UseOAuthAuthorizationServer(opcoesConfiguracaoToken);

d-) Gera uma autenticação do portador do OAuth para o aplicativo OWIN. A classe de opções fornece informações necessárias para controlar o comportamento do middleware Bearer Authentication.

    app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

Com isso temos ativada a geração de tokens de acesso na nossa Web API. Só falta definir o Provider e verificar a autenticação do usuário usando a nossa classe FuncionariosSeguranca.

Vamos criar a classe ProviderDeTokensDeAcesso() que herda da classe OAuthAuthorizationServerProvider com o código abaixo:

using FuncionariosAPIService.Services;
using Microsoft.Owin.Security.OAuth;
using System.Security.Claims;
using System.Threading.Tasks;
namespace FuncionariosAPIService
{
    public class ProviderDeTokensDeAcesso : OAuthAuthorizationServerProvider
    {
        public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
        {
            context.Validated();
        }
        public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
        {
            if (FuncionariosSeguranca.Login(context.UserName, context.Password))
            {
                var identity = new ClaimsIdentity(context.Options.AuthenticationType);
                identity.AddClaim(new Claim("sub", context.UserName));
                identity.AddClaim(new Claim("role", "user"));
                context.Validated(identity);
            }
            else
            {
                context.SetError("acesso inválido", "As credenciais do usuário não conferem....");
                return;
            }
        }
    }
}

O código dessa classe verifica se as credenciais do usuário são válidas e neste caso gera um token de acesso. Para isso estamos usando a classe FuncionariosSeguranca().

Esta classe implementa os seguintes métodos :

No nosso exemplo, se as credenciais do usuário forem inválidas será retornado uma mensagem de erro:

 context.SetError("acesso inválido", "As credenciais do usuário não conferem....");

Pronto ! Já temos tudo pronto e agora podemos testar a nossa implementação.

Na próxima parte do artigo vamos fazer isso usando o Postman.

Todavia digo-vos a verdade, que vos convém que eu vá; porque, se eu não for, o Consolador não virá a vós; mas, quando eu for, vo-lo enviarei.
E, quando ele vier, convencerá o mundo do pecado, e da justiça e do juízo.
Do pecado, porque não crêem em mim;
Da justiça, porque vou para meu Pai, e não me vereis mais;

João 16:7-10

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti